package io.renren.modules.substation.controller;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.renren.common.utils.Constant;
import io.renren.modules.substation.entity.*;
import io.renren.modules.substation.iSendMsg;
import io.renren.modules.substation.service.*;
import io.renren.modules.sys.controller.AbstractController;
import io.renren.modules.sys.entity.SysUserEntity;
import io.renren.socket.DecodeIEC104JSON;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import io.renren.common.utils.PageUtils;
import io.renren.common.utils.R;



/**
 * 设备当前状态表
 *
 * @author yzx
 * @email sunlightcs@gmail.com
 * @date 2020-06-20 11:20:38
 */
@RestController
@RequestMapping("substation/tbusidevstatusinfo")
public class TBusiDevStatusInfoController extends AbstractController {


    public  static  final  int LINE_DAY =7 ;
    public  static  final  String VAR_KIND_00 = "00" ;
    @Autowired
    private TBusiDevStatusInfoService tBusiDevStatusInfoService;

    @Autowired
    private TInfoDevInfoService tInfoDevInfoService;

    @Autowired
    private TBusiDevMonitorInfoService tBusiDevMonitorInfoService;

    @Autowired
    private TBusiDevMonitorHisService tBusiDevMonitorHisService;

    @Autowired
    private TInfoVariableInfoService tInfoVariableInfoService;

    @Autowired
    private TBaseDictInfoService tBaseDictInfoService;

    @Autowired
    private TBusiDevAirInfoService tBusiDevAirInfoService;

    @Autowired
    private TFileInfoService tFileInfoService;
    @Autowired
    private TBusiAreaHotInfoService tBusiAreaHotInfoService;
    @Autowired
    private TInfoAreaInfoService tInfoAreaInfoService;
    @Autowired
    private TInfoAlarmConfigService tInfoAlarmConfigService;
    @Autowired
    private TSampIrSensorTempService  tSampIrSensorTempService;

    @Autowired
    private TSampThDataInfoService tSampThDataInfoService;

    @Autowired
    private TSampJfDataInfoService tSampJfDataInfoService;

    @Autowired
    private TPointInfoDataConfService tPointInfoDataConfService;

    @Autowired
    private TTotalDayInfoService tTotalDayInfoService;

    @Autowired
    private TTotalMinuteInfoService tTotalMinuteInfoService;

    @Autowired
    private TTotalMonthInfoService tTotalMonthInfoService;

    @Autowired
    private TBusiLinkageLogService tBusiLinkageLogService;

//    /**
//     * 列表
//     */
//    @RequestMapping("/list")
//    @RequiresPermissions("substation:tbusidevstatusinfo:list")
//    public R list(@RequestParam Map<String, Object> params){
//        PageUtils page = tBusiDevStatusInfoService.queryPage(params);
//
//
//        return R.ok().put("page", page);
//    }


    public String getBase64Pic(List<TFileInfoEntity> list, String purpose){
        TFileInfoEntity file_tmp=tFileInfoService.getFileInfoByType(list,purpose);
        String pic_type=file_tmp.getFileType();

        if(null == pic_type || pic_type.isEmpty())
        {
            return "";
        }
        if(pic_type.equals("jpg"))
        {
            pic_type= "jpeg";
        }
        String data = file_tmp.getFileData();
        String pic_base64Info = "data:image/"+pic_type+";base64," + data;
//        logger.debug("pic_base64Info:"+ pic_base64Info);
        return pic_base64Info;
    }

    public String getBase64PicNohead(List<TFileInfoEntity> list, String purpose){
        TFileInfoEntity file_tmp=tFileInfoService.getFileInfoByType(list,purpose);
        String pic_type=file_tmp.getFileType();

        if(null == pic_type || pic_type.isEmpty())
        {
            return "";
        }
        if(pic_type.equals("jpg"))
        {
            pic_type= "jpeg";
        }
        String data = file_tmp.getFileData();
//        String pic_base64Info = "data:image/"+pic_type+";base64," + data;
//        logger.debug("pic_base64Info:"+ pic_base64Info);
        return data;
    }


    public PageUtils getPDlistByMap(Map<String, Object> params){

        int page = Integer.parseInt((String)params.get("page"));
        int limit = Integer.parseInt((String)params.get("limit"));
        String devCode = (String)params.get("devCode");
        String devArea = (String)params.get("devArea");
        String devType = (String)params.get("devType");
        String isAlarm = (String)params.get("isAlarm");
        String isVaild = (String)params.get("isVaild");

        logger.debug("devType"+devType);
        logger.debug("devCode"+devCode);
        logger.debug("isAlarm"+isAlarm);
        logger.debug("isVaild"+isVaild);
        logger.debug("devArea"+devArea);

        TBusiDevStatusShowInfo tBusiDevStatusShowInfo =new TBusiDevStatusShowInfo();
        tBusiDevStatusShowInfo.setDevCode(devCode);
        tBusiDevStatusShowInfo.setIsAlarm(isAlarm);
        tBusiDevStatusShowInfo.setIsVaild(isVaild);
        tBusiDevStatusShowInfo.setDevType(devType);
        tBusiDevStatusShowInfo.setDevArea(devArea);
        tBusiDevStatusShowInfo.setLimit(limit);
        tBusiDevStatusShowInfo.setPageFlag(1);
        int startIndex=limit*(page-1);
        tBusiDevStatusShowInfo.setStartIndex(startIndex>=0?startIndex:0);

        int total_num= (int)tBusiDevStatusInfoService.queryDevShowInfoListCount(tBusiDevStatusShowInfo);
        List<TBusiDevStatusShowInfo> ret_list=tBusiDevStatusInfoService.queryDevShowInfoList(tBusiDevStatusShowInfo);

        List<TBaseDictInfoEntity> dic_List=tBaseDictInfoService.queryByDictKey("DEV_TYPE");
        int query_interval= 15;
        if(dic_List.size()>0)
        {
            query_interval=Integer.parseInt(dic_List.get(0).getDictValue());
        }
        query_interval=0-query_interval*60;
        logger.debug("query_interval:"+query_interval);

        for(TBusiDevStatusShowInfo o : ret_list){

            logger.debug("设备:"+o.getDevCode());
            //查询列表数据
            TBusiDevMonitorInfoEntity queryTmp= new TBusiDevMonitorInfoEntity();
            queryTmp.setDevCode(o.getDevCode());
            queryTmp.setVariableKind("00");

            //查询局方变量信息
            List<TBusiDevMonitorInfoEntity> queryList = tBusiDevMonitorInfoService.queryMonitorByCondition(queryTmp);

            //查询寻图片信息
            TFileInfoEntity query_file= new TFileInfoEntity();
            query_file.setDevId(o.getDevCode());
            List<TFileInfoEntity> queryFileList = tFileInfoService.queryFileInfoByCondition(query_file);

            PartialDischargeInfo tmp= new PartialDischargeInfo();
            tmp.setDtlList(queryList);
            tmp.init();

            //整合
            for(TBusiDevMonitorInfoEntity q : queryList){

//                TBusiDevReportInfo rtmp = new TBusiDevReportInfo();
//                rtmp.setVarKind(q.getVariableKind());
//                rtmp.setVarCode(q.getVariableCode());
//                rtmp.setDevCode(q.getDevCode());
//                String endtime =q.getMonitorTime();
//                String startime = getAddTime(endtime,query_interval);
//                rtmp.setStartDate(startime);
//                rtmp.setEndDate(endtime);

                if(q.getVariableDesc().contains(PartialDischargeInfo.PDINFO))
                {
                    //局放状态正常； 峰值 ，均值，频次，
                    TSampJfDataInfoEntity query_jf=new TSampJfDataInfoEntity();
                    query_jf.setDevId(q.getDevCode());
                    TSampJfDataInfoEntity tmp_jf=tSampJfDataInfoService.queryJfInfoByCondition(query_jf);
                    if(tmp_jf!=null)
                    {
                        String msg=tmp.getPdInfo();
                        msg = msg+" 频次：" +tmp_jf.getDschCnt()+"次/秒 "+";峰值"+tmp_jf.getMaxDsch()+"mV"+";均值"+tmp_jf.getAvDsch()+"mV";
                        logger.debug(msg);
                        tmp.setPdInfo(msg);
                        tmp.setPdInfoMaxValue(tmp_jf.getMaxDsch());
                    }

                    tmp.setPdInfoPic1(getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_JFPRPDIMG));
                    tmp.setPdInfoPic2(getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_JFPRPSIMG));
                    o.setPdInfoPRPDPic(getBase64PicNohead(queryFileList,PartialDischargeInfo.PURPOSE_JFPRPDIMG));
                    o.setPdInfoPRPSPic(getBase64PicNohead(queryFileList,PartialDischargeInfo.PURPOSE_JFPRPSIMG));

                }
                else  if(q.getVariableDesc().contains(PartialDischargeInfo.INFRAREDINFO))
                {
                    //红外
                    TSampIrSensorTempEntity query_ir= new TSampIrSensorTempEntity();
                    query_ir.setDevId(q.getDevCode());
                    query_ir.setAreaName("ALL");
                    TSampIrSensorTempEntity tmp_ir=tSampIrSensorTempService.queryIrInfoByCondition(query_ir);

                    if(tmp_ir!=null)
                    {
                        String msg=tmp.getInfraredInfo();
                        msg = msg+";最高温:"+tmp_ir.getAreaMaxTemp()+"°c"+";最低温度:"+tmp_ir.getAreaMinTemp()+"°c";
                        logger.debug(msg);
                        tmp.setInfraredInfo(msg);
                        tmp.setInfraredInfoMaxValue(tmp_ir.getAreaMaxTemp());
                    }
                    else
                    {
                        tmp.setInfraredInfo("");
                    }


                    tmp.setInfraredInfoPic1(getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_IRIMG));
                    tmp.setInfraredInfoPic2(getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_IROVIMG));

                    o.setInfraredInfoPic(getBase64PicNohead(queryFileList,PartialDischargeInfo.PURPOSE_IRIMG));

                }
                else  if(q.getVariableDesc().contains(PartialDischargeInfo.PICTURESINFO))
                {
                    //可见光
                    tmp.setPicturesInfoPic1(getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_CAMIMG));
                    tmp.setPicturesInfoPic2(getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_CAMSOBELIMG));
                    tmp.setPicturesInfoPic3(getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_CAMIDIMG));

                    o.setPicturesInfoPic(getBase64PicNohead(queryFileList,PartialDischargeInfo.PURPOSE_CAMIMG));

                }
                else  if(q.getVariableDesc().contains(PartialDischargeInfo.TEMPERATURE))
                {

                    //温度湿度
                    TSampThDataInfoEntity query_th= new TSampThDataInfoEntity();
                    query_th.setDevId(q.getDevCode());
                    TSampThDataInfoEntity tmp_th=tSampThDataInfoService.queryThInfoByCondition(query_th);

                    if(tmp_th!=null)
                    {
                        String msg=tmp.getTemperatureAndHumidityInfo();
                        msg = "温度:"+tmp_th.getAmbientTemp()+"°C"+";湿度:"+tmp_th.getRelativeHumidity()+"%rH";
                        logger.debug(msg);
                        tmp.setTemperatureAndHumidityInfo(msg);
                        tmp.setTemperature(tmp_th.getAmbientTemp()+"°C");
                        tmp.setHumidityInfo(tmp_th.getRelativeHumidity()+"%rH");
                    }


                }
                else  if(q.getVariableDesc().contains(PartialDischargeInfo.NOISEINFO))
                {
                    tmp.setNoiseInfoValue("");
                    o.setNoiseInfoPic("");
                }

            }

            o.setPartialDischargeInfo(tmp);
            o.initPartialDischargeInfo();

        }
        PageUtils retPageUtil=new PageUtils(ret_list,total_num,limit,page);
        return retPageUtil;
    }

    /**
     * 列表
     */
    @RequestMapping("/PDlist")
    @RequiresPermissions("substation:tbusidevstatusinfo:PDlist")
    public R PDlist(@RequestParam Map<String, Object> params){
        PageUtils retPageUtil=getPDlistByMap(params);
        return R.ok().put("page", retPageUtil);
    }


    public Map<String, Object> getNewPowerlistByMap( Map<String, Object> params){

        int page = Integer.parseInt((String)params.get("page"));
        int limit = Integer.parseInt((String)params.get("limit"));
        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");
        String isAlarm = (String)params.get("isAlarm");
        String isVaild = (String)params.get("isVaild");
        String devArea = (String)params.get("devArea");
        String devAreaflag = (String)params.get("devAreaflag");

        logger.debug("devType"+devType);
        logger.debug("devCode"+devCode);
        logger.debug("isAlarm"+isAlarm);
        logger.debug("isVaild"+isVaild);
        logger.debug("devArea"+devArea);

        TBusiDevStatusShowInfo tBusiDevStatusShowInfo =new TBusiDevStatusShowInfo();
        tBusiDevStatusShowInfo.setDevCode(devCode);
        tBusiDevStatusShowInfo.setIsAlarm(isAlarm);
        tBusiDevStatusShowInfo.setIsVaild(isVaild);
        tBusiDevStatusShowInfo.setDevType(devType);
        tBusiDevStatusShowInfo.setDevArea(devArea);
        tBusiDevStatusShowInfo.setDevAreaflag(devAreaflag);
        tBusiDevStatusShowInfo.setLimit(limit);
        tBusiDevStatusShowInfo.setPageFlag(1);
        int startIndex=limit*(page-1);
        tBusiDevStatusShowInfo.setStartIndex(startIndex>=0?startIndex:0);

        int total_num= (int)tBusiDevStatusInfoService.queryDevShowInfoListCount(tBusiDevStatusShowInfo);
        List<TBusiDevStatusShowInfo> ret_list=tBusiDevStatusInfoService.queryDevShowInfoList(tBusiDevStatusShowInfo);


        //环境变量tablehead
        TInfoVariableInfoEntity querykind= new TInfoVariableInfoEntity();
        querykind.setVariableType("01");
        List<TInfoVariableInfoEntity> kindList=tInfoVariableInfoService.queryVariableByCondition(querykind);
        List<SelectItemInfo> headList =new ArrayList<SelectItemInfo>();
        for(int i=0;i< kindList.size();i++)
        {
            String svalue=String.valueOf(kindList.get(i).getVariableId());
            //String.valueOf(i+1);
            String slabel=kindList.get(i).getVariableName();
            //"环境量"+Integer.parseInt(kindList.get(i).getVariableKind());
            SelectItemInfo tmp = new SelectItemInfo(slabel, svalue);
            headList.add(tmp);
        }

        TInfoVariableInfoEntity tInfoVariableInfoEntity = new TInfoVariableInfoEntity();
        List<TInfoVariableInfoEntity> VariableList=tInfoVariableInfoService.queryVariableByCondition(tInfoVariableInfoEntity);


        int max_head_num=0;
        for(TBusiDevStatusShowInfo o : ret_list){

            //查询列表数据
            o.setHeadList(headList);
            TBusiDevMonitorInfoEntity queryTmp= new TBusiDevMonitorInfoEntity();
            queryTmp.setDevCode(o.getDevCode());
            queryTmp.setVariableKind(VAR_KIND_00);
            List<TBusiDevMonitorInfoEntity> queryList = tBusiDevMonitorInfoService.queryMonitorByCondition(queryTmp);
            for(TBusiDevMonitorInfoEntity m : queryList){
                logger.debug(m.getVariableCode());
                logger.debug(m.getVariableDesc());
                if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_WATER,"00")))////水位
                {
                    o.setWaterLevel(m.getVariableValue());
                    o.setWaterLevelStatus(m.getVariableStatus());
                    continue;
                }else  if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_SMOKE,"00")))////烟感
                {
                    o.setSmokeStatus(m.getVariableStatus());
                    continue;
                }else if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_RED,"00")))////红外三鉴
                {
                    o.setInfraredStatus(m.getVariableStatus());
                    continue;
                }else if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_LIGHT,"00")))////灯光
                {
                    o.setLightStatus(m.getVariableStatus());
                    continue;
                }
            }

            List<SelectItemInfo> headvalueList =new ArrayList<SelectItemInfo>();
            for(int i=0;i< headList.size();i++)
            {
                String slabel= headList.get(i).getLabel();
                String svalue= "未知";

                for(TBusiDevMonitorInfoEntity m : queryList){
                    if(headList.get(i).getValue().equals(m.getVariableCode()))
                    {
                        svalue=m.getVariableValue();

                    }
                }
                if(svalue.equals(getVariableCodeByName(VariableList,ConstChinese.CH_WATER,"00")))////水位
                {
                    svalue=doFormateStatus(svalue);
                }else  if(svalue.equals(getVariableCodeByName(VariableList,ConstChinese.CH_SMOKE,"00")))////烟感
                {
                    svalue=doFormateStatus(svalue);
                }else if(svalue.equals(getVariableCodeByName(VariableList,ConstChinese.CH_RED,"00")))////红外三鉴
                {
                    svalue=doFormateStatus(svalue);
                }else if(svalue.equals(getVariableCodeByName(VariableList,ConstChinese.CH_LIGHT,"00")))////灯光
                {
                    svalue=doFormateStatus(svalue);
                }

                SelectItemInfo tmp = new SelectItemInfo(slabel, svalue);
                headvalueList.add(tmp);
            }
            o.setHeadValueList(headvalueList);

        }

        PageUtils retPageUtil=new PageUtils(ret_list,total_num,limit,page);


        Map<String, Object> result = new HashMap<>();
        result.put("headList", headList);
        result.put("page", retPageUtil);
        return result;


    }


    //导出查询动环详细信息
    public Map<String, Object> getPointPowerlistByMap( Map<String, Object> params){

        int page = Integer.parseInt((String)params.get("page"));
        int limit = Integer.parseInt((String)params.get("limit"));
        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");
        String isAlarm = (String)params.get("isAlarm");
        String isVaild = (String)params.get("isVaild");
        String devArea = (String)params.get("devArea");
        String devAreaflag = (String)params.get("devAreaflag");


        TBusiDevStatusShowInfo tBusiDevStatusShowInfo =new TBusiDevStatusShowInfo();
        tBusiDevStatusShowInfo.setDevCode(devCode);
        tBusiDevStatusShowInfo.setIsAlarm(isAlarm);
        tBusiDevStatusShowInfo.setIsVaild(isVaild);
        tBusiDevStatusShowInfo.setDevType(devType);
        tBusiDevStatusShowInfo.setDevArea(devArea);
        tBusiDevStatusShowInfo.setDevAreaflag(devAreaflag);
        tBusiDevStatusShowInfo.setLimit(limit);
        tBusiDevStatusShowInfo.setPageFlag(1);
        int startIndex=limit*(page-1);
        tBusiDevStatusShowInfo.setStartIndex(startIndex>=0?startIndex:0);

        int total_num= (int)tBusiDevStatusInfoService.queryDevShowInfoListCount(tBusiDevStatusShowInfo);
        List<TBusiDevStatusShowInfo> ret_list=tBusiDevStatusInfoService.queryDevShowInfoList(tBusiDevStatusShowInfo);


        List<PowerDetailInfo>  pointValueList= new ArrayList<PowerDetailInfo>();
        List<SelectItemInfo> pointHeadList =new ArrayList<SelectItemInfo>();

        //环境变量tablehead
        TInfoVariableInfoEntity querykind= new TInfoVariableInfoEntity();
        querykind.setVariableType("01");
        querykind.setVariableTypeFl("0");
        List<TInfoVariableInfoEntity> kindList=tInfoVariableInfoService.queryVariableByCondition(querykind);
        List<SelectItemInfo> headList =new ArrayList<SelectItemInfo>();

        for(int i=0;i< kindList.size();i++)
        {
            String svalue=String.valueOf(kindList.get(i).getVariableId());
            //String.valueOf(i+1);
            String slabel=kindList.get(i).getVariableName();
            //"环境量"+Integer.parseInt(kindList.get(i).getVariableKind());
            SelectItemInfo tmp = new SelectItemInfo(slabel, svalue);
            headList.add(tmp);
            pointHeadList.add(tmp);

        }

        TInfoVariableInfoEntity tInfoVariableInfoEntity = new TInfoVariableInfoEntity();
        List<TInfoVariableInfoEntity> VariableList=tInfoVariableInfoService.queryVariableByCondition(tInfoVariableInfoEntity);


        int max_head_num=0;
        for(TBusiDevStatusShowInfo o : ret_list){

            //查询列表数据
            o.setHeadList(headList);
            TBusiDevMonitorInfoEntity queryTmp= new TBusiDevMonitorInfoEntity();
            queryTmp.setDevCode(o.getDevCode());
            queryTmp.setVariableKind(VAR_KIND_00);
            List<TBusiDevMonitorInfoEntity> queryList = tBusiDevMonitorInfoService.queryMonitorByCondition(queryTmp);
            for(TBusiDevMonitorInfoEntity m : queryList){
                logger.debug(m.getVariableCode());
                logger.debug(m.getVariableDesc());
                if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_WATER,"00")))////水位
                {
                    o.setWaterLevel(m.getVariableValue());
                    o.setWaterLevelStatus(m.getVariableStatus());
                    continue;
                }else  if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_SMOKE,"00")))////烟感
                {
                    o.setSmokeStatus(m.getVariableStatus());
                    continue;
                }else if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_RED,"00")))////红外三鉴
                {
                    o.setInfraredStatus(m.getVariableStatus());
                    continue;
                }else if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_LIGHT,"00")))////灯光
                {
                    o.setLightStatus(m.getVariableStatus());
                    continue;
                }
            }

            //按设备编号查询
            List<SelectItemInfo> devPeVarList =new ArrayList<SelectItemInfo>();

            DevDetailInfo querypevar= new DevDetailInfo();
            querypevar.setDevCode(o.getDevCode());
            List<DevDetailInfo> p_list = tPointInfoDataConfService.queryPointInfoDataConfByCondition(querypevar);
            SelectItemInfo tmp;
            for(DevDetailInfo p : p_list)
            {
                if(p.getTypeFl().equals("1"))//遥测
                {
                    tmp = new SelectItemInfo(p.getVarName(), p.getVarValue());
                }
                else if(p.getTypeFl().equals("0"))//遥信
                {
                    String svalue=  doFormateFLStatus(p.getVarValue());
                    tmp = new SelectItemInfo(p.getVarName(), svalue);
                }
                else
                {
                    tmp = new SelectItemInfo(p.getVarName(), p.getVarValue());
                }
                devPeVarList.add(tmp);

            }
            o.setDevPeVarList(devPeVarList);

            List <SelectItemInfo>errList= new ArrayList <SelectItemInfo>();
            for(SelectItemInfo e : devPeVarList)
            {
                SelectItemInfo e_tmp= e;
                if(e.getValue().equals(ConstChinese.CH_BJ))
                {
                    errList.add(e_tmp);
                }
            }

            o.setErrList(errList);

            //按变量 查询每个设备
            List<SelectItemInfo> headvalueList =new ArrayList<SelectItemInfo>();
            for(int i=0;i< headList.size();i++)
            {
                String slabel= headList.get(i).getLabel();
                String svalue= "未知";

                for(TBusiDevMonitorInfoEntity m : queryList){
                    if(headList.get(i).getValue().equals(m.getVariableCode()))
                    {
                        svalue=m.getVariableValue();

                    }
                }
                if(svalue.equals(getVariableCodeByName(VariableList,ConstChinese.CH_WATER,"00")))////水位
                {
                    svalue=doFormateStatus(svalue);
                }else  if(svalue.equals(getVariableCodeByName(VariableList,ConstChinese.CH_SMOKE,"00")))////烟感
                {
                    svalue=doFormateStatus(svalue);
                }else if(svalue.equals(getVariableCodeByName(VariableList,ConstChinese.CH_RED,"00")))////红外三鉴
                {
                    svalue=doFormateStatus(svalue);
                }else if(svalue.equals(getVariableCodeByName(VariableList,ConstChinese.CH_LIGHT,"00")))////灯光
                {
                    svalue=doFormateStatus(svalue);
                }

                SelectItemInfo tmp2 = new SelectItemInfo(slabel, svalue);
                headvalueList.add(tmp2);
            }
            o.setHeadValueList(headvalueList);

        }

        //按点表查询分类
        for(int i=0;i< pointHeadList.size();i++)
        {
            PowerDetailInfo pdi_tmp =new PowerDetailInfo();
            pdi_tmp.setVarName(pointHeadList.get(i).getLabel());

            List<SelectItemInfo> hvl_tmp= new ArrayList<SelectItemInfo>();
            for(TBusiDevStatusShowInfo o : ret_list){

                DevDetailInfo queryTmp= new DevDetailInfo();
                queryTmp.setDevCode(o.getDevCode());
                queryTmp.setVarName(pointHeadList.get(i).getLabel());
                List<DevDetailInfo> p_list = tPointInfoDataConfService.queryPointInfoDataConfByCondition(queryTmp);
                SelectItemInfo tmp;
                if(p_list.size()>0)
                {
                    DevDetailInfo dinfo= p_list.get(0);
                    if(dinfo.getTypeFl().equals("1"))//遥测
                    {
                        tmp = new SelectItemInfo(o.getDevCode(), dinfo.getVarValue());
                    }
                    else if(dinfo.getTypeFl().equals("0"))//遥信
                    {
                        String svalue=  doFormateFLStatus(dinfo.getVarValue());
                        tmp = new SelectItemInfo(o.getDevCode(), svalue);
                    }
                    else
                    {
                        tmp = new SelectItemInfo(o.getDevCode(), dinfo.getVarValue());
                    }

                }
                else
                {
                    tmp = new SelectItemInfo(o.getDevCode(), "无");
                }
                hvl_tmp.add(tmp);

            }
            pdi_tmp.setHeadValueList(hvl_tmp);
            pointValueList.add(pdi_tmp);
        }


        PageUtils retPageUtil=new PageUtils(ret_list,total_num,limit,page);


        Map<String, Object> result = new HashMap<>();
        result.put("headList", headList);
        result.put("page", retPageUtil);
        result.put("pointHeadList", pointHeadList);
        result.put("pointValueList", pointValueList);
        return result;


    }

    public Map<String, Object> getPowerlistByMap( Map<String, Object> params){

        int page = Integer.parseInt((String)params.get("page"));
        int limit = Integer.parseInt((String)params.get("limit"));
        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");
        String isAlarm = (String)params.get("isAlarm");
        String isVaild = (String)params.get("isVaild");
        String devArea = (String)params.get("devArea");
        String devAreaflag = (String)params.get("devAreaflag");

        logger.debug("devType"+devType);
        logger.debug("devCode"+devCode);
        logger.debug("isAlarm"+isAlarm);
        logger.debug("isVaild"+isVaild);
        logger.debug("devArea"+devArea);

        TBusiDevStatusShowInfo tBusiDevStatusShowInfo =new TBusiDevStatusShowInfo();
        tBusiDevStatusShowInfo.setDevCode(devCode);
        tBusiDevStatusShowInfo.setIsAlarm(isAlarm);
        tBusiDevStatusShowInfo.setIsVaild(isVaild);
        tBusiDevStatusShowInfo.setDevType(devType);
        tBusiDevStatusShowInfo.setDevArea(devArea);
        tBusiDevStatusShowInfo.setDevAreaflag(devAreaflag);
        tBusiDevStatusShowInfo.setLimit(limit);
        tBusiDevStatusShowInfo.setPageFlag(1);
        int startIndex=limit*(page-1);
        tBusiDevStatusShowInfo.setStartIndex(startIndex>=0?startIndex:0);

        int total_num= (int)tBusiDevStatusInfoService.queryDevShowInfoListCount(tBusiDevStatusShowInfo);
        List<TBusiDevStatusShowInfo> ret_list=tBusiDevStatusInfoService.queryDevShowInfoList(tBusiDevStatusShowInfo);


        //环境变量tablehead
        List<TInfoVariableInfoEntity> kindList=tInfoVariableInfoService.queryVariableKind();
        List<SelectItemInfo> headList =new ArrayList<SelectItemInfo>();
        for(int i=0;i< kindList.size();i++)
        {
            String svalue=String.valueOf(i+1);
            String slabel="环境量"+Integer.parseInt(kindList.get(i).getVariableKind());
            SelectItemInfo tmp = new SelectItemInfo(slabel, svalue);
            headList.add(tmp);
        }

        TInfoVariableInfoEntity tInfoVariableInfoEntity = new TInfoVariableInfoEntity();
        List<TInfoVariableInfoEntity> VariableList=tInfoVariableInfoService.queryVariableByCondition(tInfoVariableInfoEntity);

        int max_head_num=0;
        for(TBusiDevStatusShowInfo o : ret_list){
            //查询列表数据
            o.setHeadList(headList);
            TBusiDevMonitorInfoEntity queryTmp= new TBusiDevMonitorInfoEntity();
            queryTmp.setDevCode(o.getDevCode());
            queryTmp.setVariableKind(VAR_KIND_00);
            List<TBusiDevMonitorInfoEntity> queryList = tBusiDevMonitorInfoService.queryMonitorByCondition(queryTmp);
            for(TBusiDevMonitorInfoEntity m : queryList){
                logger.debug(m.getVariableCode());
                logger.debug(m.getVariableDesc());
                if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_WATER,"00")))////水位
                {
                    o.setWaterLevel(m.getVariableValue());
                    o.setWaterLevelStatus(m.getVariableStatus());
                }else  if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_SMOKE,"00")))////烟感
                {
                    o.setSmokeStatus(m.getVariableStatus());
                }else if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_RED,"00")))////红外三鉴
                {
                    o.setInfraredStatus(m.getVariableStatus());
                }else if(m.getVariableCode().equals(getVariableCodeByName(VariableList,ConstChinese.CH_LIGHT,"00")))////灯光
                {
                    o.setLightStatus(m.getVariableStatus());
                }
            }


            //查询环境量

            String environmentStr="";
            List<String> envstrList = new ArrayList<String>();
            List<EnvironmentInfo> envList = new ArrayList<EnvironmentInfo>();
            for(int i=0;i< kindList.size();i++)
            {

                TBusiDevMonitorInfoEntity queryKind=new TBusiDevMonitorInfoEntity();
                queryKind.setDevCode(o.getDevCode());
                queryKind.setVariableKind(kindList.get(i).getVariableKind());
                List<TBusiDevMonitorInfoEntity> monList = tBusiDevMonitorInfoService.queryMonitorByCondition(queryKind);
                EnvironmentInfo tmp= new EnvironmentInfo();
                tmp.setDevCode(o.getDevCode());
                tmp.setKind(kindList.get(i).getVariableKind());
                tmp.setDtlList(monList);
                tmp.setShowInfoByList();
                logger.debug(tmp.getShowInfo());
                environmentStr+=tmp.getShowInfo();
                environmentStr+="\r\n";

                envstrList.add(tmp.getShowInfo());
                envList.add(tmp);
            }

            o.setEnvironmentStrList(envstrList);
            o.setEnvironmentStr(environmentStr);
            o.setEnvironmentCount(envList.size());
            o.setEnvironmentStringList(envList);
        }

        PageUtils retPageUtil=new PageUtils(ret_list,total_num,limit,page);


        Map<String, Object> result = new HashMap<>();
        result.put("headList", headList);
        result.put("page", retPageUtil);
        return result;


    }


    /**
     * 列表
     */
    @RequestMapping("/Powerlist")
    @RequiresPermissions("substation:tbusidevstatusinfo:Powerlist")
    public R Powerlist(@RequestParam Map<String, Object> params){


        Map<String, Object> result = getPowerlistByMap(params);
        return R.ok().put("result", result);

        //return R.ok().put("page", retPageUtil);
    }


    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    @RequiresPermissions("substation:tbusidevstatusinfo:info")
    public R info(@PathVariable("id") Long id){
        TBusiDevStatusInfoEntity tBusiDevStatusInfo = tBusiDevStatusInfoService.getById(id);

        TBusiDevStatusShowInfo tBusiDevStatusShowInfo =new TBusiDevStatusShowInfo(tBusiDevStatusInfo);

        List<TInfoDevInfoEntity> devInfolist = tInfoDevInfoService.list();

        for(TInfoDevInfoEntity o : devInfolist){
            if(tBusiDevStatusShowInfo.getDevCode().equals(o.getDevCode()))
            {

                tBusiDevStatusShowInfo.setDevName(o.getDevName());
                logger.debug(tBusiDevStatusShowInfo.getDevName());
            }
        }
        return R.ok().put("tBusiDevStatusInfo", tBusiDevStatusShowInfo);
    }


    /**
     * 信息
     */
    @RequestMapping("/getEnvironmentInfo")
    public R getEnvironmentInfo(@RequestParam Map<String, Object> params){


        logger.debug("getEnvironmentInfo start");
        Map<String, Object> result = new HashMap<>();

        List<PolyLineDataInfo> ret_list =new ArrayList<PolyLineDataInfo>();

        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");
        logger.debug("devType"+devType);
        logger.debug("devCode"+devCode);

        List<String> legendData =new ArrayList<String>();//标识
        List<String> xAxisdData =new ArrayList<String>();//x轴

        //获取环境量内容数量
        List<TInfoVariableInfoEntity> kindList=tInfoVariableInfoService.queryVariableKind();
        logger.debug("获取监测变量数量"+kindList.size());
        for(int i=0;i<kindList.size();i++)
        {
            String en_legend="环境量"+Integer.parseInt(kindList.get(i).getVariableKind());
            legendData.add(en_legend);
        }

        for(int k=LINE_DAY-1;k>=0;k--)
        {
            String en_date=getTimeDay("MM/dd",0-k);
            xAxisdData.add(en_date);//X轴
        }


        List<TBaseDictInfoEntity> en_type_List=tBaseDictInfoService.queryByDictKey("ENVIRONMENT_TYPE");
        logger.debug("获取环境量内容数量:"+en_type_List.size());

        for(int i=0;i<en_type_List.size();i++)
        {

            List<PolylineInfo> plist = new ArrayList<PolylineInfo>();//线条信息

            String en_name=en_type_List.get(i).getDictDesc();
            String en_type=en_type_List.get(i).getDictValue();
            String en_symbol=en_type_List.get(i).getKeyDesc();
            //获取监测变量数量
            for(int j=0;j< kindList.size();j++)
            {

                PolylineInfo polylineInfo = new PolylineInfo();
                String en_legend="环境量"+Integer.parseInt(kindList.get(j).getVariableKind());

                String en_kind=kindList.get(j).getVariableKind();
                //具体值
                List<Double> seriesData =new ArrayList<Double>();

                //查询7天
                logger.debug("查询7天");
                for(int k=LINE_DAY-1;k>=0;k--)
                {
                    TBusiDevMonitorHisEntity his_query = new TBusiDevMonitorHisEntity();
                    his_query.setVariableKind(en_kind);
                    his_query.setDevCode(devCode);
                    String en_date=getTimeDay("yyyyMMdd",0-k);
                    his_query.setMonitorTime(en_date);
                    his_query.setVariableCode(en_type);

                    //查询历史表
                    List<TBusiDevMonitorHisEntity> his_list=tBusiDevMonitorHisService.queryMonitorHisByCondition(his_query);
                    double value=0;
                    int count=his_list.size();
                    for(int m=0; m<count;m++)
                    {
                        value+=Double.parseDouble(his_list.get(m).getVariableValue());
                    }
                    if(count>0)
                    {
                        value =value/count;
                    }
                    seriesData.add(value);
                    logger.debug("seriesData"+value);
                }

                logger.debug("填充polylineInfo");
                polylineInfo.setName(en_legend);
                polylineInfo.setType("line");
                polylineInfo.setData(seriesData);
                plist.add(polylineInfo);

            }

            logger.debug(en_name+"填充PolyLineDataInfo");
            PolyLineDataInfo tmp =new PolyLineDataInfo();
            tmp.setId(i+1);
            tmp.setTitleText(en_name);
            tmp.setLegendData(legendData);
            tmp.setxAxisdData(xAxisdData);
            tmp.setPlist(plist);
            tmp.setYname("单位:"+en_symbol);
            ret_list.add(tmp);
        }

        result.put("dataListCount", ret_list.size());
        result.put("dataList", ret_list);
        //result.put("enlist", enlist);
        return R.ok().put("result", result);
        //return R.ok().put("tBusiDevStatusInfo", tBusiDevStatusShowInfo);
    }

    /**
     * 信息
     */
    @RequestMapping("/getJfDetailList")
    public R getJfDetailList(@RequestParam Map<String, Object> params){


        logger.debug("getJfDetailList start");
        Map<String, Object> result = new HashMap<>();

//        List<PolyLineDataInfo> ret_list =new ArrayList<PolyLineDataInfo>();

        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");
        String queryType = (String)params.get("queryType");
        logger.debug("devType"+devType);
        logger.debug("devCode"+devCode);
        logger.debug("queryType"+queryType);

        List<String> legendData =new ArrayList<String>();//标识
        List<String> xAxisdData =new ArrayList<String>();//x轴


        //获取环境量内容数量
        List<TBaseDictInfoEntity> jfchildList=tBaseDictInfoService.queryByDictKey("JF_CHILD");

        for(int i=0;i<jfchildList.size();i++)
        {
            String en_legend=ConstChinese.CH_JF+jfchildList.get(i).getDictDesc();
            legendData.add(en_legend);
        }

        int day=0;
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式
        String nowTime=df.format(new Date());// new Date()为获取当前系统时间

        String startDate="";
        String  endDate=nowTime.substring(0,8);
        int queryday=0;
        if(queryType.equals("1"))//7天
        {
            queryday=7;
//            for(int k=queryday-1;k>=0;k--)
//            {
//                String en_date=getTimeDay("YYYY/MM/dd",0-k);
//                xAxisdData.add(en_date);//X轴
//            }

        }else if(queryType.equals("2"))//1月
        {
             queryday=getDaysByYearMonth(nowTime.substring(0,6));
//            for(int k=queryday-1;k>=0;k--)
//            {
//                String en_date=getTimeDay("YYYY/MM/dd",0-k);
//                xAxisdData.add(en_date);//X轴
//            }
        }else if(queryType.equals("3"))//三月
        {

            queryday+=getDaysByYearMonth(getAddMonth(nowTime.substring(0,6),0-1));
            queryday+=getDaysByYearMonth(getAddMonth(nowTime.substring(0,6),0-2));
            queryday+=getDaysByYearMonth(getAddMonth(nowTime.substring(0,6),0-3));
//            for(int k=queryday-1;k>=0;k--)
//            {
//                String en_date=getTimeDay("YYYY/MM/dd",0-k);
//                xAxisdData.add(en_date);//X轴
//            }
        }
        for(int k=queryday-1;k>=0;k--)
            {
                String en_date=getTimeDay("YYYY/MM/dd",0-k);
                xAxisdData.add(en_date);//X轴
            }

        startDate=getTimeDay("yyyyMMdd",0-queryday);

        logger.debug("startDate="+startDate);
        logger.debug("endDate"+endDate);

        List<PolylineInfo> plist = new ArrayList<PolylineInfo>();//线条信息

        //获取监测变量数量
        for(int j=0;j< jfchildList.size();j++)
        {
            String varCode="J7-"+jfchildList.get(j).getDictValue();
            PolylineInfo polylineInfo = new PolylineInfo();
            String en_legend=ConstChinese.CH_JF+jfchildList.get(j).getDictDesc();
            //String en_symbol= jfchildList.get(i).getKeyDesc();

            //具体值
            List<Double> seriesData =new ArrayList<Double>();

            TTotalDayInfoForShow query_total= new TTotalDayInfoForShow();
            query_total.setDevCode(devCode);
            query_total.setVariableCode(varCode);
            query_total.setStartDate(startDate);
            query_total.setEndDate(endDate);

            List<TTotalDayInfoEntity> totalList=tTotalDayInfoService.queryTotalDayInfoByCondition(query_total);

            for(int i=0;i<xAxisdData.size();i++)
            {
                String totalDate=xAxisdData.get(i).replace("/","");
                double xAxisdDataValue=0;
                for(int k=0;k<totalList.size();k++)
                {
                    double ivalue=0;
                    String value=totalList.get(k).getVariableAvg();
                    if(null==value||value.isEmpty())
                    {
                    }
                    else
                    {
                        ivalue=Double.parseDouble(value);
                    }
                    if(totalList.get(k).getTotalTime().equals(totalDate))
                    {
                        xAxisdDataValue=ivalue;
                        break;
                    }

                }
                seriesData.add(xAxisdDataValue);

            }





            logger.debug("填充polylineInfo");
            polylineInfo.setName(en_legend);
            polylineInfo.setType("line");
            polylineInfo.setData(seriesData);
            plist.add(polylineInfo);

        }


        PolyLineDataInfo ret_info =new PolyLineDataInfo();

        ret_info.setTitleText("局放信息");
        ret_info.setLegendData(legendData);
        ret_info.setxAxisdData(xAxisdData);
        ret_info.setPlist(plist);
        ret_info.setYname("");


        logger.debug("填充PolyLineDataInfo end ");
        result.put("dataListCount", 1);
        result.put("data", ret_info);
        //result.put("enlist", enlist);
        return R.ok().put("result", result);
        //return R.ok().put("tBusiDevStatusInfo", tBusiDevStatusShowInfo);
    }


    /**
     * 保存
     */
    @RequestMapping("/save")
    @RequiresPermissions("substation:tbusidevstatusinfo:save")
    public R save(@RequestBody TBusiDevStatusInfoEntity tBusiDevStatusInfo){
        tBusiDevStatusInfoService.save(tBusiDevStatusInfo);

        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    @RequiresPermissions("substation:tbusidevstatusinfo:update")
    public R update(@RequestBody TBusiDevStatusInfoEntity tBusiDevStatusInfo){

        tBusiDevStatusInfo.setLastOpr(getUserId());
        tBusiDevStatusInfo.setLastTime(new Date());
        tBusiDevStatusInfoService.updateById(tBusiDevStatusInfo);

        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    @RequiresPermissions("substation:tbusidevstatusinfo:delete")
    public R delete(@RequestBody Long[] ids){
        tBusiDevStatusInfoService.removeByIds(Arrays.asList(ids));

        return R.ok();
    }

    public String getTimeDay(String smilpestr,int index){
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat fmt = new SimpleDateFormat(smilpestr);
        calendar.add(Calendar.DAY_OF_MONTH,index);
        String date = fmt.format(calendar.getTime());
        logger.debug("date:"+date);
        return date;
    }

    public String getAddTime(String startTime,int index){
        try
        {
            Calendar calendar = Calendar.getInstance();
            SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmss");
            Date sdate = fmt.parse(startTime);
            calendar.setTime(sdate);
            calendar.add(Calendar.SECOND,index);
            String date = fmt.format(calendar.getTime());
            logger.debug("new date:"+date);
            return date;
        }
        catch (ParseException e) {
            //e.printStackTrace();
            logger.debug("parse startTime error :"+ startTime);
            return startTime;
        }

    }
    public String getAddMonth(String month,int index){
        try
        {
            Calendar calendar = Calendar.getInstance();
            SimpleDateFormat fmt = new SimpleDateFormat("yyyyMM");
            Date sdate = fmt.parse(month);
            calendar.setTime(sdate);
            calendar.add(Calendar.MONTH,index);
            String date = fmt.format(calendar.getTime());
            logger.debug("new date:"+date);
            return date;
        }
        catch (ParseException e) {
            //e.printStackTrace();
            logger.debug("parse startTime error :"+ month);
            return month;
        }

    }

    public String getLastDayOfMonth(String yearMonth) {
        int year = Integer.parseInt(yearMonth.substring(0,4));  //年
        int month = Integer.parseInt(yearMonth.substring(4)); //月
        Calendar cal = Calendar.getInstance();
        // 设置年份
        cal.set(Calendar.YEAR, year);
        // 设置月份
        // cal.set(Calendar.MONTH, month - 1);
        cal.set(Calendar.MONTH, month); //设置当前月的上一个月
        // 获取某月最大天数
        //int lastDay = cal.getActualMaximum(Calendar.DATE);
        int lastDay = cal.getMinimum(Calendar.DATE); //获取月份中的最小值，即第一天
        // 设置日历中月份的最大天数
        //cal.set(Calendar.DAY_OF_MONTH, lastDay);
        cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //上月的第一天减去1就是当月的最后一天
        // 格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(cal.getTime());
    }


    public String  getVariableCodeByName(String varName){
        String ret ="";
        TInfoVariableInfoEntity tInfoVariableInfoEntity = new TInfoVariableInfoEntity();
        List<TInfoVariableInfoEntity> VariableList=tInfoVariableInfoService.queryVariableByCondition(tInfoVariableInfoEntity);
        for(TInfoVariableInfoEntity o : VariableList){
            if(o.getVariableName().equals(varName))
            {
                ret=String.valueOf(o.getVariableId());
            }
        }
        return ret;
    }

    public  String  getVariableCodeByName(List<TInfoVariableInfoEntity> VariableList,String varName,String kind){
        String ret ="";
           for(TInfoVariableInfoEntity o : VariableList){
            if(o.getVariableName().equals(varName))
            {
                ret=String.valueOf(o.getVariableId());
            }
        }
        return ret;
    }

    public  String  getVariableCodeByName(String varName,String kind){
        String ret ="";
        TInfoVariableInfoEntity tInfoVariableInfoEntity = new TInfoVariableInfoEntity();
        tInfoVariableInfoEntity.setVariableKind(kind);
        List<TInfoVariableInfoEntity> VariableList=tInfoVariableInfoService.queryVariableByCondition(tInfoVariableInfoEntity);
        for(TInfoVariableInfoEntity o : VariableList){
            if(o.getVariableName().equals(varName))
            {
                ret=String.valueOf(o.getVariableId());
            }
        }
        return ret;
    }


    @RequestMapping("/pdControl")
    public R pdControl(@RequestParam Map<String, Object> params){
        Map<String, Object> result = new HashMap<>();

        logger.debug("pdControl start");
        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");
        int type = Integer.parseInt((String)params.get("type"));
        String sret ="";
        logger.debug("devType"+devType);
        logger.debug("devCode"+devCode);

        TInfoDevInfoEntity devQuery= new TInfoDevInfoEntity();
        devQuery.setDevCode(devCode);
        TInfoDevInfoEntity devInfo=tInfoDevInfoService.queryDevInfoByCondition(devQuery);

        logger.debug("devInfo"+devInfo.getIpAddr());
        String cmd="";
        String condtionValue="";
        switch (type)
        {
            case 1:
            {
                JSONArray sendarray = new JSONArray();
                JSONObject obj = new JSONObject();
                obj.put("devId", devInfo.getDevCode());
                obj.put("purpose", "rtSample");
                obj.put("devSrc", "dev");
                sendarray.add(obj);
                condtionValue="召唤";
                //召唤
                sret=iSendMsg.sendCmdRtSampling(devInfo.getIpAddr(),sendarray,"","","");
                break;
            }
            case 2:
                //重启
                break;
            case 3:
            {
                JSONArray sendarray = new JSONArray();
                JSONObject obj = new JSONObject();
                obj.put("devId", devInfo.getDevCode());
                obj.put("purpose", "log");
                obj.put("devSrc", "dev");
                sendarray.add(obj);
                condtionValue="日志下载";
                //日志下载
                sret=iSendMsg.sendCmdRtSampling(devInfo.getIpAddr(),sendarray,"","","");
                break;
            }
            case 4:
            {
                condtionValue="日志管理";
                //日志管理
                JSONArray sendarray = new JSONArray();
                JSONObject obj = new JSONObject();
                obj.put("devId", devInfo.getDevCode());
                obj.put("purpose", "log");
                obj.put("devSrc", "dev");
                sendarray.add(obj);
                sret=iSendMsg.sendCmdRtSampling(devInfo.getIpAddr(),sendarray,"","","");
                break;
            }
            case 5:
            {
                condtionValue="声音下载";
                //声音下载
                JSONArray sendarray = new JSONArray();
                JSONObject obj = new JSONObject();
                obj.put("devId", devInfo.getDevCode());
                obj.put("purpose", "soundRecord");
                obj.put("devSrc", "dev");
                sendarray.add(obj);
                sret=iSendMsg.sendCmdRtSampling(devInfo.getIpAddr(),sendarray,devInfo.getDevCode(),"","");

                break;
            }
            case 6:
                condtionValue="坏点修复";
                //坏点修复
                sret=iSendMsg.sendCmdIrBPR(devInfo.getDevCode(),devInfo.getIpAddr());
                break;
            default:
                break;
        }

        if(null==sret||sret.isEmpty())
        {

            logger.debug("控制命令发送结果："+sret);
            result.put("resultStr","命令发送成功");
            return R.ok().put("result",result);
        }
        else
        {
            logger.debug("控制命令发送结果："+sret);
            result.put("resultStr",sret);
            return R.error().put("result",result);
        }

    }

    @RequestMapping("/getAirControlInfo")
    public R getAirControlInfo(@RequestParam Map<String, Object> params){
        logger.debug("getAirControlInfo start");
        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");
        String airCode = (String)params.get("airCode");
        logger.debug("devType"+devType);
        logger.debug("airCode"+airCode);

        TBusiDevAirInfoEntity queryTmp= new TBusiDevAirInfoEntity();
        queryTmp.setDevCode(devCode);
        queryTmp.setAirCode(airCode);
        TBusiDevAirInfoEntity retInfo=tBusiDevAirInfoService.queryAirInfoByCondition(queryTmp);
        if(retInfo==null)
        {
            return R.error().put("info",retInfo);
        }
        return R.ok().put("info",retInfo);
    }

    @RequestMapping("/setAirControlInfo")
    public R setAirControlInfo(@RequestBody Map<String, Object> params){
        logger.debug("setAirControlInfo start");

        Map<String, Object> result = new HashMap<>();


        TBusiDevAirInfoEntity tmp= new TBusiDevAirInfoEntity();
        String airCode = (String)params.get("airCode");
        String devCode = (String)params.get("devCode");
        String swingWindStatus = (String)params.get("swingWindStatus");
        String modeStatus = (String)params.get("modeStatus");
        String windStatus = (String)params.get("windStatus");
        String electricityA = (String)params.get("electricityA");
        String electricityB = (String)params.get("electricityB");
        String electricityC = (String)params.get("electricityC");
        String temperature = (String)params.get("temperature");

        tmp.setAirCode(airCode);
        tmp.setDevCode(devCode);
        tmp.setSwingWindStatus(swingWindStatus);
        tmp.setModeStatus(modeStatus);
        tmp.setWindStatus(windStatus);
        tmp.setElectricityA(electricityA);
        tmp.setElectricityB(electricityB);
        tmp.setElectricityC(electricityC);
        tmp.setTemperature(temperature);
        boolean openStatus = (boolean)params.get("openStatus");
        if(openStatus)
        {
            tmp.setOpenStatus("1");//开
        }
        else
        {
            tmp.setOpenStatus("0");//关
        }

        logger.debug(tmp.toString());

        TInfoDevInfoEntity devQuery= new TInfoDevInfoEntity();
        devQuery.setDevCode(devCode);
        TInfoDevInfoEntity devInfo=tInfoDevInfoService.queryDevInfoByCondition(devQuery);

        logger.debug("devInfo"+devInfo.getIpAddr());


        String controlType="2";
        String devId =devInfo.getDevCode();
        String addPublic="";
        String typeDesc="";
        String Vaule="";


        JSONArray sendarray = new JSONArray();


        JSONObject obj = new JSONObject();
        obj.put("devId", devInfo.getDevCode());
        obj.put("addPublic", airCode);
        obj.put("typeDesc", "开关");
        obj.put("Vaule", tmp.getOpenStatus());
        sendarray.add(obj);

        JSONObject obj1 = new JSONObject();
        obj1.put("devId", devInfo.getDevCode());
        obj1.put("addPublic", airCode);
        obj1.put("typeDesc", "温度");
        obj1.put("Vaule", temperature);
        sendarray.add(obj1);


        JSONObject obj2 = new JSONObject();
        obj2.put("devId", devInfo.getDevCode());
        obj2.put("addPublic", airCode);
        obj2.put("typeDesc", "电流A");
        obj2.put("Vaule", electricityA);
        sendarray.add(obj2);

        JSONObject obj3 = new JSONObject();
        obj3.put("devId", devInfo.getDevCode());
        obj3.put("addPublic", airCode);
        obj3.put("typeDesc", "电流B");
        obj3.put("Vaule", electricityB);
        sendarray.add(obj3);

        JSONObject obj4 = new JSONObject();
        obj4.put("devId", devInfo.getDevCode());
        obj4.put("addPublic", airCode);
        obj4.put("typeDesc", "电流C");
        obj4.put("Vaule", electricityC);
        sendarray.add(obj4);

        JSONObject obj5 = new JSONObject();
        obj5.put("devId", devInfo.getDevCode());
        obj5.put("addPublic", airCode);
        obj5.put("typeDesc", "模式");
        obj5.put("Vaule", modeStatus);
        sendarray.add(obj5);

        JSONObject obj6 = new JSONObject();
        obj6.put("devId", devInfo.getDevCode());
        obj6.put("addPublic", airCode);
        obj6.put("typeDesc", "摆风");
        obj6.put("Vaule", swingWindStatus);
        sendarray.add(obj6);

        JSONObject obj7 = new JSONObject();
        obj7.put("devId", devInfo.getDevCode());
        obj7.put("addPublic", airCode);
        obj7.put("typeDesc", "风量");
        obj7.put("Vaule", windStatus);
        sendarray.add(obj7);

        String sret = iSendMsg.remoteControl104(controlType,devInfo.getDevCode(),null,null,null,sendarray);
        if(null==sret||sret.isEmpty())
        {
            logger.debug("控制命令发送结果："+sret);
            result.put("resultStr","命令发送成功");
            return R.ok().put("result",result);
        }
        else
        {
            logger.debug("控制命令发送结果："+sret);
            result.put("resultStr",sret);
            return R.error().put("result",result);
        }
        //return R.ok();
    }


    @RequestMapping("/getOutControlInfo")
    public R getOutControlInfo(@RequestParam Map<String, Object> params){
        logger.debug("getAirControlInfo start");
        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");
        logger.debug("devType"+devType);
        logger.debug("devCode"+devCode);
        return R.ok();
    }

    @RequestMapping("/setOutControlInfo")
    public R setOutControlInfo(@RequestBody Map<String, Object> params){
        logger.debug("getAirControlInfo start");
        Map<String, Object> result = new HashMap<>();


        String devCode = (String)params.get("devCode");
        String addPublic = (String)params.get("addPublic");
        String typeDesc = (String)params.get("typeDesc");

        String controlType = (String)params.get("controlType");

        String value=(String)params.get("value");
 //       boolean status = (boolean)params.get("status");
//        if(status)
//        {
//            istatus="0";
//        }
//        else
//        {
//            istatus="1";
//        }
        logger.debug("typeDesc"+typeDesc);
        logger.debug("addPublic"+addPublic);
        logger.debug("devCode"+devCode);
        logger.debug("value"+value);
        logger.debug("controlType"+controlType);


        TInfoDevInfoEntity devQuery= new TInfoDevInfoEntity();
        devQuery.setDevCode(devCode);
        TInfoDevInfoEntity devInfo=tInfoDevInfoService.queryDevInfoByCondition(devQuery);

        logger.debug("devInfo"+devInfo.getIpAddr());



        JSONArray sendarray = new JSONArray();

        JSONObject obj = new JSONObject();
        obj.put("devId", devInfo.getDevCode());
        obj.put("addPublic", addPublic);
        obj.put("typeDesc", typeDesc);
        obj.put("Vaule", value);
        sendarray.add(obj);



        String sret = iSendMsg.remoteControl104(controlType,devInfo.getDevCode(),null,null,null,sendarray);
        if(null==sret||sret.isEmpty())
        {
            TBusiLinkageLogEntity in_tmp= new TBusiLinkageLogEntity();
            in_tmp.setPerformConditions(devInfo.getDevCode()+"["+typeDesc+":"+value+"]");
            in_tmp.setPerformContent("界面点击下发");
            in_tmp.setTriggerConditions("界面点击下发");
            SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式
            String ndate = df.format(new Date());// new Date()为获取当前系统时间，也可使用当前时间戳
            in_tmp.setLinkageTime(ndate);
            SysUserEntity sysUserEntity = getUser();
            in_tmp.setCreateOpr(sysUserEntity.getUserId());
            in_tmp.setCreateTime(new Date());
            in_tmp.setLastOpr(sysUserEntity.getUserId());
            in_tmp.setLastTime(new Date());
            tBusiLinkageLogService.save(in_tmp);

            logger.debug("控制命令发送结果："+sret);
            result.put("resultStr","命令发送成功");
            return R.ok().put("result",result);
        }
        else
        {
            logger.debug("控制命令发送结果："+sret);
            result.put("resultStr",sret);
            return R.error().put("result",result);
        }

        //return R.ok();
    }


    @RequestMapping("/getWaterPumpInfo")
    public R getWaterPumpInfo(@RequestParam Map<String, Object> params){
        logger.debug("getAirControlInfo start");
        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");
        logger.debug("devType"+devType);
        logger.debug("devCode"+devCode);
        List<Integer>waterList = new ArrayList<Integer>();
        List<String>xAxisList = new ArrayList<String>();
        Map<String, Object> result = new HashMap<>();


        TBusiDevMonitorInfoEntity queryTmp=new TBusiDevMonitorInfoEntity();
        queryTmp.setDevCode(devCode);
        String code=getVariableCodeByName(ConstChinese.CH_WATER,"00");
        queryTmp.setVariableCode(code);
        queryTmp.setVariableKind(VAR_KIND_00);
        List<TBusiDevMonitorInfoEntity> queryList = tBusiDevMonitorInfoService.queryMonitorByCondition(queryTmp);

        int count= queryList.size();

        for(int i=0;i<count;i++)
        {
            int value=Integer.parseInt(queryList.get(i).getVariableValue());
            waterList.add(value);
            xAxisList.add("水泵"+String.valueOf(i+1));
        }

        result.put("waterList",waterList);
        result.put("xAxisList",xAxisList);
        return R.ok().put("result",result);
    }

    @RequestMapping("/setWaterPumpInfo")
    public R setWaterPumpInfo(@RequestBody Map<String, Object> params){
        logger.debug("getAirControlInfo start");
        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");
        logger.debug("devType"+devType);
        logger.debug("devCode"+devCode);
        return R.ok();
    }


    /**
     * 列表
     */
    @RequestMapping("/getReportDataList")
    //@RequiresPermissions("substation:tbusidevstatusinfo:getReportDataList")
    public R getReportDataList(@RequestParam Map<String, Object> params){

        int page = Integer.parseInt((String)params.get("page"));
        int limit = Integer.parseInt((String)params.get("limit"));

        String devCode = (String)params.get("devCode");
        String devArea = (String)params.get("devArea");
        String devType = (String)params.get("devType");
        String queryType = (String)params.get("queryType");
        String devAreaName = (String)params.get("devAreaName");
        String devAreaParentId = (String)params.get("devAreaParentId");
        String isExPort = (String)params.get("isExPort");

        String startDate ="";
        String endDate = "";
        String variableName= (String)params.get("variableName");
        String variableCode= (String)params.get("variableCode");



        String[] variableCodeList=variableCode.split(",");
        String[] variableNameList=variableName.split(",");

        TInfoDevInfoEntity devQuery= new TInfoDevInfoEntity();
        devQuery.setDevCode(devCode);
        TInfoDevInfoEntity devInfo=tInfoDevInfoService.queryDevInfoByCondition(devQuery);


        TInfoAreaInfoEntity areaInfo = tInfoAreaInfoService.getById(devArea);

        Map<String, Object> result = new HashMap<>();
        TTotalDayInfoForShow query_total= new TTotalDayInfoForShow();
        query_total.setDevCode(devCode);

        //界面展示
        List<TTotalDayInfoEntity> querShowList= new ArrayList<TTotalDayInfoEntity>();

        String queryDate="";
        if(queryType.equals("1"))//日
        {


            queryDate = (String)params.get("queryDate");
            startDate =queryDate+"000000";
            endDate= queryDate+"235959";
            query_total.setStartDate(startDate);
            query_total.setEndDate(endDate);
        }
        else if(queryType.equals("2"))//周
        {

            startDate = (String)params.get("queryWeek")+"000000";
            endDate= getAddTime(startDate,8*24*60*60);
            query_total.setStartDate(startDate);
            query_total.setEndDate(endDate);
        }
        else if(queryType.equals("3"))//月
        {

            startDate = (String)params.get("queryMonth")+"01";
            endDate= getLastDayOfMonth((String)params.get("queryMonth"));
            query_total.setStartDate(startDate);
            query_total.setEndDate(endDate);
        }
        else if(queryType.equals("4"))//季
        {
            startDate = (String)params.get("startDate")+"01000000";
            endDate = (String)params.get("endDate");
            endDate= getLastDayOfMonth(endDate)+"235959";
            query_total.setStartDate(startDate);
            query_total.setEndDate(endDate);
        }
        else if(queryType.equals("5"))//年
        {
            startDate = (String)params.get("queryYear")+"01";
            endDate = (String)params.get("queryYear")+"12";
            query_total.setStartDate(startDate);
            query_total.setEndDate(endDate);
        }

        logger.debug("devType"+devType);
        logger.debug("devCode"+devCode);
        logger.debug("queryType"+queryType);
        logger.debug("devAreaName"+devAreaName);
        logger.debug("devArea"+devArea);
        logger.debug("getStartDate"+query_total.getStartDate());
        logger.debug("getEndDate"+query_total.getEndDate());
        logger.debug("variableCode"+variableCode);
        logger.debug("variableName"+variableName);


        //页面查询显示


        //文件名
        String title ="监测报表";
        if(queryType.equals("1"))
        {
            title+="日报";
            title+=queryDate;
        }
        else if(queryType.equals("2"))
        {
            title=title+"周报"+startDate+"-"+endDate;
        }
        else if(queryType.equals("3"))
        {
            title=title+"月报"+(String)params.get("queryMonth");
        }
        else if(queryType.equals("4"))
        {
            title=title+"季报"+startDate+"-"+endDate;
        }
        else if(queryType.equals("5"))
        {
            title=title+"年报"+(String)params.get("queryYear");
        }

        List<TTotalReportShowInfo> retList = new ArrayList<TTotalReportShowInfo>();


        for(int i=0;i<variableCodeList.length;i++)
        {
            TTotalReportShowInfo showInfo= new TTotalReportShowInfo();


            showInfo.setSheetName(variableNameList[i]);
            //报表合并头
            List<List<String>> mergesthList = new ArrayList<List<String>>();

            List<String> mergesthList0 = new ArrayList<String>();
            List<String> mergesthList1 = new ArrayList<String>();
            List<String> mergesthList2 = new ArrayList<String>();
            List<String> mergesthList3 = new ArrayList<String>();
            List<String> mergesthList4 = new ArrayList<String>();

            String mergesth0="";
            if(queryType.equals("1"))
            {
                mergesth0="时间："+getFormateTime((String)params.get("queryDate"),"1");
            }
            else if(queryType.equals("3"))
            {
                mergesth0="时间："+getFormateTime((String)params.get("queryMonth"),"3");
            }
            else if(queryType.equals("5"))
            {
                mergesth0="时间："+(String)params.get("queryYear");
            }

            mergesthList0.add(mergesth0);
            mergesthList0.add("");

            String mergesth1="地址："+areaInfo.getAreaAddr();
            mergesthList1.add(mergesth1);
            mergesthList1.add("");

            String mergesth2="区域："+devAreaName;
            mergesthList2.add(mergesth2);
            mergesthList2.add("");
            String mergesth3="设备："+devInfo.getDevName();
            mergesthList3.add(mergesth3);
            mergesthList3.add("");
            String mergesth4="变量："+variableNameList[i];
            mergesthList4.add(mergesth4);
            mergesthList4.add("");
            mergesthList.add(mergesthList0);
            mergesthList.add(mergesthList1);
            mergesthList.add(mergesthList2);
            mergesthList.add(mergesthList3);
            mergesthList.add(mergesthList4);

            //报表头
            List<String> tHeader = new ArrayList<String>();
            tHeader.add("时间");

            tHeader.add(variableNameList[i]+"最大值");
            tHeader.add(variableNameList[i]+"最小值");
            tHeader.add(variableNameList[i]+"平均值");

            List<String> filterField = new ArrayList<String>();
            filterField.add("totalTime");
            filterField.add("variableMax");
            filterField.add("variableMin");
            filterField.add("variableAvg");

            //报表内容

            query_total.setVariableCode(variableCodeList[i]);

            List<TTotalDayInfoEntity> totalList= new ArrayList<TTotalDayInfoEntity>();

            if(queryType.equals("1"))//日
            {

                totalList=tTotalMinuteInfoService.queryTotalMinuteInfoByCondition(query_total);
                for(TTotalDayInfoEntity t :totalList)
                {
                    t.setTotalTime(getFormateTime(t.getTotalTime(),"2"));
                    TTotalDayInfoEntity q_tmp=t;
                    querShowList.add(q_tmp);
                }
            }
            else if(queryType.equals("3"))//月
            {
                totalList=tTotalDayInfoService.queryTotalDayInfoByCondition(query_total);
                for(TTotalDayInfoEntity t :totalList)
                {
                    t.setTotalTime(getFormateTime(t.getTotalTime(),"1"));
                    TTotalDayInfoEntity q_tmp=t;
                    querShowList.add(q_tmp);
                }
            }
            else if(queryType.equals("5"))//年
            {
                totalList=tTotalMonthInfoService.queryTotalMonthInfoByCondition(query_total);
                for(TTotalDayInfoEntity t :totalList)
                {
                    t.setTotalTime(getFormateTime(t.getTotalTime(),"3"));
                    TTotalDayInfoEntity q_tmp=t;
                    querShowList.add(q_tmp);
                }

            }
            showInfo.setFilterField(filterField);
            showInfo.settHeader(tHeader);
            showInfo.setDataList(totalList);
            showInfo.setMergesthList(mergesthList);
            retList.add(showInfo);
        }



        result.put("dataList", retList);
        result.put("count", retList.size());
        result.put("querShowList", querShowList);
        result.put("querShowcount", querShowList.size());
        result.put("title", title);
 //       result.put("mergesth", mergesthList);



        //result.put("enlist", enlist);
        return R.ok().put("result", result);

    }

    public String getFormateTime(String src,String type)
    {
        if(src.isEmpty())
        {
            return src;
        }
        if(type.equals("1"))//YYYY/MM/DD
        {
            return src.substring(0,4)+"/"+src.substring(4,6)+"/"+src.substring(6,8);
        }
        else if(type.equals("2"))//YYYY/MM/DD HH:mm:ss
        {
            return src.substring(0,4)+"/"+src.substring(4,6)+"/"+src.substring(6,8)+" "+src.substring(8,10)+":"+
                    src.substring(10,12)+":"+src.substring(12,14);
        }
        else  if(type.equals("3"))//YYYY/MM
        {
            return src.substring(0,4)+"/"+src.substring(4,6);
        }
        else  if(type.equals("4"))//HH:mm:ss
        {
            return src.substring(0,2)+":"+src.substring(2,4)+":"+src.substring(4,6);
        }
        return src;

    }

    /**
     * 列表
     */
    @RequestMapping("/getVariableList")
    public R getVariableList(@RequestParam Map<String, Object> params){

        TInfoVariableInfoEntity tInfoVariableInfoEntity = new TInfoVariableInfoEntity();
        tInfoVariableInfoEntity.setVariableKind("00");
        List<TInfoVariableInfoEntity> VariableList=tInfoVariableInfoService.queryVariableByCondition(tInfoVariableInfoEntity);

        SelectItemInfo temp0=new SelectItemInfo("--请选择--","");
        List<SelectItemInfo> varlist = new ArrayList<>();
        varlist.add(temp0);
        for(TInfoVariableInfoEntity o : VariableList){
            SelectItemInfo m = new SelectItemInfo(o.getVariableName(),String.valueOf(o.getVariableId()));
            varlist.add(m);
        }
        return R.ok().put("varlist", varlist);
    }


    public Map<String, Object> getAutoReportListByMap( Map<String, Object> params){

        String pic_type="jpeg";
        String data = "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/fqojikIg4UIQEEQBh2J1h1ZdHd388477wDw4x//mClTpnDVVVcBMHr0aG677TYURWHlypWBfUpKSmhqagKgoaGBrq4uTj31VN1xTz31VLq7u4MiiAe6z0D4n//5H6688kpOOukk/vKXv+giggXByYgAFAQh7ojgG9mcf/75lJeXM3v2bObPn88vf/lLqqurAXj33Xd57733uOGGG3C73ezcuZN58+Yxa9YsbrvtNgBaW1v54x//yCWXXEJbWxt///vfKSsr45JLLuGPf/xjINXLE088QUZGBosXLw57n2h5+umnueGGGzj55JNZu3ZtTI4pCINFwtehpUmTNryaE/34on09iZ7DUG4vv/yy0tLSorz33nvKVVddFbS9uLhYefzxx5UDBw4oXq9X2b59u3LjjTfqxuTk5Cj333+/snfvXsXr9Sp79+5V7r//fiUnJycw5s0331Q2btwY0T7R+AD629/+9jflyJEjyujRoxN+raVJC7cl+R4IgiBExXD24/PnGBQEQRguyBKwIAgDQpZ1BUEQhi4iAAVBCAsRfIIgCMMHEYCCIFiyadMmbr75Zu6++24RfIIgCMMIEYCCIAQws/JVVlaK+BMEQRhmiAAUhBGMLOsKgiCMTEQACsIIQgSfIAiCACIABWHYM5zTswiCIAgDQwSgIAwzxMonCIIghEIEoCAMcUTwCYIgCJEiAlAQhhgi+ARBEIRoEQEoCEMA8eMTBEEQYokIQEFwIGLlEwRBEOKJCEBBcAAi+ARBEITBRASgICQIWdZ1LpWVlYmegiAIQtxRpEmTFv+2adMmXUv0fMJtlZWVCZ/DYLxGbTO7d4meozRp0uLf8vPzlWeeeUb54osvlM7OTmXPnj3KnXfeGTTujjvuUPbv3690d3cr+/btU26//fa4jYljS/wFlyZtOLahKviMbbgKQDvBZ3YvEz1fadKkxb+9+OKLSnt7u7J27Vpl6dKlygsvvKAoiqKsXr06MGbFihWKoijKs88+q1xxxRXKc889pyiKoqxYsSLmY+LZknwPBEGIkuHqx1dZWcmGDRsSPY2oMS7rRvKaNm3aNGzupyAI5kydOpWtW7eydu1afvjDHwb66+rqACgtLQVg69attLS0cM455wTGbNy4kdzcXKZNmxbTMfFEfAAFIQrEj8+5RCP4BEEYeYwbN44NGzbwyiuv6Prr6+uZ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";
        data+="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";
        data+="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";

        //"+JGPfMSsWLHCHDlyxCQSCXPkyBGzYsUK85GPfISxybHV1NQYL0uXLk3tu3PnTnPgwAHP52MM/LePf/zj5tFHHzVHjx41iUTCHDhwwNxxxx399rvppptMe3u7SSQS5tixY2bNmjWmqqqKcaBl1cre/x8AAAA4giIQAAAAxxAAAQAAHEMABAAAcAwBEAAAwDEEQAAAAMcQAAEAABxDAAQAAHAMARAAAMAxBEAAAADHEAABAAAcQwAEAABwDAEQAADAMQRAAAAAxxAAAQAAHEMABAAAcAwBEAAAwDEEQAAAAMcQAAEAABzz/wE4qZQiFNnFkwAAAABJRU5ErkJggg==";
        // "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";
        String pic_base64Info =  data;//"data:image/"+pic_type+";base64,"

        String queryTime = (String)params.get("queryTime");
        String devArea = (String)params.get("devArea");
        String devAreaName = (String)params.get("devAreaName");

        logger.debug("queryTime："+queryTime);
        logger.debug("devArea："+devArea);

        TBusiDevAutoReportInfo tBusiDevAutoReportInfo =new TBusiDevAutoReportInfo();
        tBusiDevAutoReportInfo.setQueryTime(queryTime);





        String title ="智能监测系统巡检报告"+queryTime;

        Map<String, Object> result = new HashMap<>();

        String path="";
        List<TBaseDictInfoEntity> path_List=tBaseDictInfoService.queryByDictKey("AUTO_REPORT_TEMP");
        if(path_List.size()==1)
        {
            path=path_List.get(0).getDictValue();
        }

        String stationName = devAreaName;
        String devTypeList="";
        List<TBaseDictInfoEntity> dic_List=tBaseDictInfoService.queryByDictKey("DEV_TYPE");
        for(int i=0;i<dic_List.size()-1;i++)
        {
            devTypeList=devTypeList+dic_List.get(i).getDictValue()+"-"+ dic_List.get(i).getDictDesc()+" ";
        }


        String reportDate= queryTime.substring(0,4)+"-"+queryTime.substring(4,6)+"-"+queryTime.substring(6,8);
        String reportTime = queryTime.substring(8,10)+":"+queryTime.substring(10,12)+":"+queryTime.substring(12,14);

        //巡检总结
        TBusiDevAutoReportSumInfo sum_query=new TBusiDevAutoReportSumInfo();
        sum_query.setDevArea(devArea);
        List<TBusiDevAutoReportSumInfo> ret_sum_list=tBusiDevStatusInfoService.queryAutoReportSumList(sum_query);

        TBusiDevAutoReportSumInfo rs_all = new TBusiDevAutoReportSumInfo();

        rs_all.setDevAreaName("合计");

        int rsdevAllNum=0;
        int rsdevNomorlNum=0;
        int rsdevWarmingNum=0;
        int rsAllNum=0;
        int rsNomorlNum=0;
        int rsWarmingNum=0;
        for(TBusiDevAutoReportSumInfo rs  : ret_sum_list)
        {
            rsdevAllNum+=Integer.valueOf(rs.getDevAllNum());
            rsdevNomorlNum+=Integer.valueOf(rs.getDevNomorlNum());
            rsdevWarmingNum+=Integer.valueOf(rs.getDevWarmingNum());
            rsAllNum+=Integer.valueOf(rs.getVarAllNum());
            rsNomorlNum+=Integer.valueOf(rs.getVarNomorlNum());
            rsWarmingNum+=Integer.valueOf(rs.getVarWarmingNum());
        }
        rs_all.setDevAllNum(String.valueOf(rsdevAllNum));
        rs_all.setDevNomorlNum(String.valueOf(rsdevNomorlNum));
        rs_all.setDevWarmingNum(String.valueOf(rsdevWarmingNum));
        rs_all.setVarAllNum(String.valueOf(rsAllNum));
        rs_all.setVarNomorlNum(String.valueOf(rsNomorlNum));
        rs_all.setVarWarmingNum(String.valueOf(rsWarmingNum));

        ret_sum_list.add(rs_all);
        //巡检记录局放

        Map<String, Object> jfparams = new HashMap<String, Object>();
        jfparams.put("devArea",devArea);
        jfparams.put("page","1");
        jfparams.put("limit","99999");
        jfparams.put("isAlarm","1");
        String isAlarm = (String)params.get("isAlarm");
        PageUtils jfPage=getPDlistByMap(jfparams);
        //报警局放
        List<TBusiDevStatusShowInfo> jfAlarmList= (List<TBusiDevStatusShowInfo>) jfPage.getList();


        TBusiDevAutoReportInfo jf_query= new TBusiDevAutoReportInfo();
        jf_query.setDevArea(devArea);
        List<TBusiDevAutoReportInfo> pd_list=tBusiDevStatusInfoService.queryPdAutoReportList(jf_query);
        int i=1;
        for(TBusiDevAutoReportInfo p  : pd_list){
            p.setId(String.valueOf(i));


            i++;
        }

        //巡检记录动力
        Map<String, Object> peparams = new HashMap<String, Object>();
        //peparams.put("devArea",devArea);
        peparams.put("devType","01");
        peparams.put("devAreaflag",devArea);
        peparams.put("page","1");
        peparams.put("limit","99999");
        Map<String, Object> peMaplist=getPointPowerlistByMap(peparams);
        PageUtils pePage=(PageUtils)peMaplist.get("page");
        List<SelectItemInfo> headList=(List<SelectItemInfo>)peMaplist.get("headList");
        List<TBusiDevStatusShowInfo> pe_list= (List<TBusiDevStatusShowInfo>) pePage.getList();

        List<SelectItemInfo> pointHeadList=(List<SelectItemInfo>)peMaplist.get("pointHeadList");
        List<PowerDetailInfo> pointValueList=(List<PowerDetailInfo>)peMaplist.get("pointValueList");



        List<TBusiDevStatusShowInfo> peAlarmList= new ArrayList<TBusiDevStatusShowInfo>();
        i=1;
        for(TBusiDevStatusShowInfo p  : pe_list){
            p.setId((long)i);
            p.setWaterLevelStatus(doFormateStatus(p.getWaterLevelStatus()));
            p.setSmokeStatus(doFormateStatus(p.getSmokeStatus()));
            p.setInfraredStatus(doFormateStatus(p.getInfraredStatus()));
            p.setLightStatus(doFormateStatus(p.getLightStatus()));

            if(p.getIsAlarm().equals("1"))
            {
                TBusiDevStatusShowInfo tmp= p;
                peAlarmList.add(tmp);
            }
            i++;
        }


        //报表信息
        result.put("stationName", stationName);
        result.put("devTypeList", devTypeList);
        result.put("reportDate", reportDate);
        result.put("reportTime", reportTime);

        //循环信息
        result.put("sumList", ret_sum_list);
        result.put("dataListCount", pd_list.size());
        result.put("dataPdList", pd_list);
        result.put("dataPeList",pePage.getList());
        result.put("headList",headList);
        result.put("jfAlarmList",jfAlarmList);
        result.put("peAlarmList",peAlarmList);
        result.put("path",path);

        result.put("pointHeadList",pointHeadList);
        result.put("pointValueList",pointValueList);


        result.put("title", title);


        String jsonstr= JSON.toJSONString(result);
        logger.debug(jsonstr);
        logger.debug("jsonstr len= "+String.valueOf(jsonstr.length()));

        Map<String, Object> result1=  JSONObject.parseObject(jsonstr);
        return result1;
        //R.ok().put("result", result1);

    }


    /**
     * 列表
     */
    @RequestMapping("/getAutoReportList")
    //@RequiresPermissions("substation:tbusidevstatusinfo:getReportDataList")
    public R getAutoReportList(@RequestParam Map<String, Object> params){

        Map<String, Object> result=  getAutoReportListByMap(params);
        return R.ok().put("result", result);

    }

    public String doFormateStatus(String value){
        String ret="未知";
        if(null==value||value.isEmpty())
        {
            return ret;
        }
        if(value.equals("0"))
        {
            ret="正常";

        }
        else if(value.equals("1"))
        {
            ret="异常";
        }
        return ret;
    }
    public String doFormateFLStatus(String value){
        String ret=ConstChinese.CH_UNKNOWN;
        if(null==value||value.isEmpty())
        {
            return ret;
        }
        if(value.equals("1"))
        {
            ret=ConstChinese.CH_ZC;

        }
        else if(value.equals("2"))
        {
            ret=ConstChinese.CH_BJ;
        }
        return ret;
    }

    /**
     * 获取动环传感器
     */
    @RequestMapping("/queryDetailList")
    public R queryDetailList(@RequestParam Map<String, Object> params){
        Map<String, Object> data = new HashMap<>();
        String devCode = (String)params.get("devCode");
        String devType = (String)params.get("devType");

        logger.debug("devCode"+devCode);
        logger.debug("devType"+devType);
        List<DevDetailInfo> ret_list= new ArrayList<DevDetailInfo>();
        if(devType.equals("00"))
        {
            //局放
        }else {
            //动力环境
            DevDetailInfo queryTmp= new DevDetailInfo();
            queryTmp.setDevCode(devCode);
            ret_list = tPointInfoDataConfService.queryPointInfoDataConfByCondition(queryTmp);

        }
        for(DevDetailInfo p  : ret_list){
           p.setConValue("0");
        }

        data.put("list", ret_list);
        return R.ok().put("data", data);
    }

    /**
     * 获取感知终端设备数量+异常设备数量
     */
    @RequestMapping("/getAllDevStatus")
    @RequiresPermissions("substation:tbusidevstatusinfo:getAllDevStatus")
    public R getAllDevStatus(){
        logger.info("substation:tbusidevstatusinfo:getAllDevStatus start...");
        Map<String, Object> data = new HashMap<>();
        int totalDevCnt = 0, totalErrorCnt = 0;
        totalDevCnt = tBusiDevStatusInfoService.countAllDevNum();
        totalErrorCnt = tBusiDevStatusInfoService.countErrorDevNum();
        data.put("totalDevCnt", totalDevCnt);
        data.put("totalErrorCnt", totalErrorCnt);
        logger.info("substation:tbusidevstatusinfo:getAllDevStatus end...");
        return R.ok().put("data", data);
    }

    /**
     * 获取所有配电房及其下属设备信息
     */
    @RequestMapping("/getAllStaInfoMap")
    @RequiresPermissions("substation:tbusidevstatusinfo:getAllStaInfoMap")
    public R getAllStaInfoMap(){
        Map<Long, Map<String, Object>> data = new HashMap<>();
        //1、获取所有区域数据
        List<TInfoAreaInfoEntity> areaList = tInfoAreaInfoService.listByUserPerms();
        Map<String, Object> dataInfo;
        for (TInfoAreaInfoEntity o : areaList) {
            dataInfo = new HashMap<>();
            dataInfo.put("info", o);
            data.put(o.getAreaId(), dataInfo);
        }
        //2、获取区域热点信息
        Map<Long, List<Map<String, Object>>> hotList = getAllAreaHotMap();
//        List<TBusiAreaHotInfoEntity> hotList = tBusiAreaHotInfoService.list();
        for (Long areaId : hotList.keySet()) {
            if (data.containsKey(areaId)){
                dataInfo = new HashMap<>();
                dataInfo = data.get(areaId);
                dataInfo.put("imgTagList", hotList.get(areaId));
                data.put(areaId, dataInfo);
            }
        }
        //3、获取被监控设备局放数据
        List<TSampJfDataInfoEntity> pdList = tSampJfDataInfoService.listOrderByTime();
        boolean pdExample = false;
        Map<String, Object> pdMap = new HashMap<>();
        List<Map<String, Object>> pdMapList = new ArrayList<>();
//        Map<Long, List<Map<String, Object>>> pdAreaList = getAllAreaHotMap();
        for (TSampJfDataInfoEntity o : pdList) {
            if (tInfoDevInfoService.getDevInfoByCode(o.getDevId()) == null)
                continue;
            Long areaId = tInfoDevInfoService.getDevInfoByCode(o.getDevId()).getDevArea();
            if ( data.containsKey(areaId)){
                String time = DateUtil.format(o.getLastTime(), "yyyy-MM-dd HH:mm:ss");
                pdMap = new HashMap<>();
                pdMap.put("time", time);
                pdMap.put("name", o.getDevId());
                String pdDesc = "局放峰值：" + o.getMaxDsch() + "mV";
                pdMap.put("max", o.getMaxDsch() + "mV");
                pdDesc += "局放均值：" + o.getAvDsch() + "mV";
                pdMap.put("av", o.getAvDsch() + "mV");
                pdDesc += "局放频次：" + o.getDschCnt() + "次/秒";
                pdMap.put("cnt", o.getDschCnt() + "次/秒");
                pdMap.put("desc", pdDesc);
                dataInfo = new HashMap<>();
                dataInfo = data.get(areaId);
                if (dataInfo.containsKey("pdMapList"))
                    pdMapList = (List<Map<String, Object>>) dataInfo.get("pdMapList");
                else
                    pdMapList = new ArrayList<>();
                pdMapList.add(pdMap);
                dataInfo.put("pdMapList", pdMapList);
                data.put(areaId, dataInfo);
                if (!pdExample) {
                    Map<String, Object> PDEchartDev = new HashMap<>();
                    PDEchartDev.put("pdDevCode", o.getDevId());
                    PDEchartDev.put("pdDevType", tInfoDevInfoService.getDevInfoByCode(o.getDevId()).getDevType());
                    data.put((long)-99999999, PDEchartDev);
                    pdExample = true;
                }
            }
        }
        //4、计算测点统计信息
        List<TBusiDevStatusInfoEntity> allDevList = tBusiDevStatusInfoService.countAllDevNumGroup();
        Map<Long, Integer> allDevMap = countAreaSubAreaDevStatus(allDevList);
        for (Long areaId: allDevMap.keySet()){
            if (data.containsKey(areaId)){
                dataInfo = new HashMap<>();
                dataInfo = data.get(areaId);
                dataInfo.put("staDevCnt", allDevMap.get(areaId));
                data.put(areaId, dataInfo);
            }
        }
        List<TBusiDevStatusInfoEntity> OfflineDevList = tBusiDevStatusInfoService.countOfflineDevNumGroup();
        Map<Long, Integer> offlineMap = countAreaSubAreaDevStatus(OfflineDevList);
        for (Long areaId: offlineMap.keySet()){
            if (data.containsKey(areaId)){
                dataInfo = new HashMap<>();
                dataInfo = data.get(areaId);
                dataInfo.put("staOfflineCnt", offlineMap.get(areaId));
                data.put(areaId, dataInfo);
            }
        }
        List<TBusiDevMonitorInfoEntity> allMeasureList = tBusiDevMonitorInfoService.countAllMeasureGroup();
        Map<Long, Integer> allMeasureMap = countAreaSubAreaDevMeasure(allMeasureList);
        for (Long areaId: allMeasureMap.keySet()){
            if (data.containsKey(areaId)){
                dataInfo = new HashMap<>();
                dataInfo = data.get(areaId);
                dataInfo.put("staMeasureCnt", allMeasureMap.get(areaId));
                data.put(areaId, dataInfo);
            }
        }
        List<TBusiDevMonitorInfoEntity> normalMeasureList = tBusiDevMonitorInfoService.countNormalMeasureGroup();
        Map<Long, Integer> normalMeasureMap = countAreaSubAreaDevMeasure(normalMeasureList);
        for (Long areaId: normalMeasureMap.keySet()){
            if (data.containsKey(areaId)){
                dataInfo = new HashMap<>();
                dataInfo = data.get(areaId);
                dataInfo.put("staNormalCnt", normalMeasureMap.get(areaId));
                data.put(areaId, dataInfo);
            }
        }
        return R.ok().put("data", data);
    }

    /**
     * 获取某区域大屏展示信息
     */
    @RequestMapping("/getScreenInfoByArea")
    @RequiresPermissions("substation:tbusidevstatusinfo:getScreenInfoByArea")
    public R getScreenInfoByArea(Long areaId, String chartLineType){
        logger.info("substation:tbusidevstatusinfo:getScreenInfoByArea start...");
        Map<Long, Map<String, Object>> data = new HashMap<>();
        //1、获取区域数据
        TInfoAreaInfoEntity areaInfo = tInfoAreaInfoService.getById(areaId);
        Map<String, Object> dataInfo = new HashMap<>();
//        dataInfo.put("info", areaInfo);
        //2、获取区域热点信息
        List<Map<String, Object>> hotList = getAreaHotListNew(areaId);
        dataInfo.put("imgTagList", hotList);
        //3、获取被监控设备局放数据+4张图片
        if (areaInfo != null && areaInfo.getAreaType().equals("2")) {//只有被监控设备才需要获取局放数据
            //获取被监控设备下属所有设备信息
            List<TInfoDevInfoEntity> devList = tInfoDevInfoService.getDevListByArea(areaId);
            List<String> devIds = new ArrayList<>();
            Map<String, TInfoDevInfoEntity> devMap = new HashMap<>();
            for (TInfoDevInfoEntity o : devList) {
                devIds.add(o.getDevCode() + "");
                devMap.put(o.getDevCode(), o);
            }
            //获取被监控设备局放数据
            if (chartLineType == null || chartLineType.equals(""))
                chartLineType = "1";
            Map<String ,Object> pdData = getJfInfoByArea(devIds, devMap, chartLineType);
            List<Map<String, Object>> pdMapList = (List<Map<String, Object>>)pdData.get("pdMapList");
            Map<String, Object> pdMapMap = (Map<String, Object>)pdData.get("pdMapMap");
            dataInfo.put("pdMapList", pdMapList);
            dataInfo.put("pdMapMap", pdMapMap);
            //获取被Map<String, M监控设备4张图片
            Map<String, Map<String, String>> imgFileMap = getFileInfoByArea(devIds);
            dataInfo.put("imgFileMap", imgFileMap);
        }
        //4、计算测点统计信息
        Map<String, Integer> devData = new HashMap<>();
        int staDevCnt = 0, staOfflineCnt = 0, staOnlineCnt = 0, staMeasureCnt = 0, staNormalCnt = 0, staUnnormalCnt = 0;
        String subAreaStr = tInfoAreaInfoService.getSubAreaList(areaId);
        staDevCnt = tBusiDevStatusInfoService.countAllDevNumByArea(subAreaStr);
        devData.put("staDevCnt", staDevCnt);
        staOfflineCnt = tBusiDevStatusInfoService.countOfflineDevNumByArea(subAreaStr);
        devData.put("staOfflineCnt", staOfflineCnt);
        devData.put("staOnlineCnt", staDevCnt - staOfflineCnt);
        staMeasureCnt = tBusiDevMonitorInfoService.countAllMeasureByArea(subAreaStr);
        devData.put("staMeasureCnt", staMeasureCnt);
        staNormalCnt = tBusiDevMonitorInfoService.countNormalMeasureByArea(subAreaStr);
        devData.put("staNormalCnt", staNormalCnt);
        devData.put("staUnnormalCnt", staMeasureCnt - staNormalCnt);
        dataInfo.put("devData", devData);

        data.put(areaId, dataInfo);
        logger.info("substation:tbusidevstatusinfo:getScreenInfoByArea end...");
        return R.ok().put("data", data);
    }

    private Map<String, Map<String, String>> getFileInfoByArea(List<String> devIds) {
        Map<String, Map<String, String>> fileMap = new HashMap<>();
        Map<String, String> fileTypeMap = new HashMap<>();
        List<TFileInfoEntity> fileList = tFileInfoService.getFileInfoByDev(devIds);
        for (TFileInfoEntity o : fileList) {
            if (fileMap.containsKey(o.getDevId())){
                fileTypeMap = fileMap.get(o.getDevId());
            }else{
                fileTypeMap = new HashMap<>();
            }
            if (o.getFileType().equals("jpg"))
                o.setFileType("jpeg");
            if (o.getPurpose().equals(PartialDischargeInfo.PURPOSE_JFPRPDIMG)){
                fileTypeMap.put("PRPD", "data:image/" + o.getFileType() + ";base64," + o.getFileData());
            }
            if (o.getPurpose().equals(PartialDischargeInfo.PURPOSE_JFPRPSIMG)){
                fileTypeMap.put("PRPS", "data:image/" + o.getFileType() + ";base64," + o.getFileData());
            }
            if (o.getPurpose().equals(PartialDischargeInfo.PURPOSE_IRIMG)){
                fileTypeMap.put("IR", "data:image/" + o.getFileType() + ";base64," + o.getFileData());
            }
            if (o.getPurpose().equals(PartialDischargeInfo.PURPOSE_IROVIMG)){
                fileTypeMap.put("IROV", "data:image/" + o.getFileType() + ";base64," + o.getFileData());
            }
            if (o.getPurpose().equals(PartialDischargeInfo.PURPOSE_CAMIMG)){
                    fileTypeMap.put("CAM", "data:image/" + o.getFileType() + ";base64," + o.getFileData());
            }
            if (o.getPurpose().equals(PartialDischargeInfo.PURPOSE_CAMSOBELIMG)){
                fileTypeMap.put("CAMSOBEL", "data:image/" + o.getFileType() + ";base64," + o.getFileData());
            }
            if (o.getPurpose().equals(PartialDischargeInfo.PURPOSE_CAMIDIMG)){
                fileTypeMap.put("CAMID", "data:image/" + o.getFileType() + ";base64," + o.getFileData());
            }
            fileMap.put(o.getDevId(), fileTypeMap);
        }
        for (String devId : fileMap.keySet()){
            fileTypeMap = new HashMap<>();
            fileTypeMap = fileMap.get(devId);
            if (fileTypeMap.get("IR") != null)
                fileTypeMap.remove("IROV");
            else{
                fileTypeMap.put("IR", fileTypeMap.get("IROV"));
                fileTypeMap.remove("IROV");
            }
            if (fileTypeMap.get("CAM") != null) {
                fileTypeMap.remove("CAMSOBEL");
                fileTypeMap.remove("CAMID");
            } else if (fileTypeMap.get("CAM") == null && fileTypeMap.get("CAMSOBEL") != null) {
                fileTypeMap.put("CAM", fileTypeMap.get("CAMSOBEL"));
                fileTypeMap.remove("CAMSOBEL");
                fileTypeMap.remove("CAMID");
            } else if (fileTypeMap.get("CAM") == null && fileTypeMap.get("CAMSOBEL") == null && fileTypeMap.get("CAMID") != null) {
                fileTypeMap.put("CAM", fileTypeMap.get("CAMID"));
                fileTypeMap.remove("CAMID");
            }
        }
        return fileMap;
    }

    private Map<String, Object> getJfInfoByArea(List<String> devIds, Map<String, TInfoDevInfoEntity> devMap, String chartLineType){
        List<Map<String, Object>> pdMapList = new ArrayList<>();
        Map<String, Map<String, Object>> pdMapMap = new HashMap<>();

        List<TSampJfDataInfoEntity> pdList = tSampJfDataInfoService.listByDev(devIds);
        boolean pdExample = false;
        Map<String, Object> pdMap = new HashMap<>();
        for (TSampJfDataInfoEntity o : pdList) {
            String time = DateUtil.format(o.getLastTime(), "yyyy-MM-dd HH:mm:ss");
            pdMap = new HashMap<>();
            pdMap.put("time", time);
            pdMap.put("name", o.getDevId());
            pdMap.put("type", devMap.get(o.getDevId()).getDevType());
            String pdDesc = "局放峰值：" + o.getMaxDsch() + "mV";
            pdMap.put("max", o.getMaxDsch() + "mV");
            pdDesc += "局放均值：" + o.getAvDsch() + "mV";
            pdMap.put("av", o.getAvDsch() + "mV");
            pdDesc += "局放频次：" + o.getDschCnt() + "次/秒";
            pdMap.put("cnt", o.getDschCnt() + "次/秒");
            pdMap.put("desc", pdDesc);
            //获取设备局放折现数据，7天
            Map<String, Object> params = new HashMap<>();
            params.put("devType", devMap.get(o.getDevId()).getDevType());
            params.put("devCode", o.getDevId());
            params.put("queryType", chartLineType);
            R data = getJfDetailList(params);
            if (data != null && (Integer)data.get("code") == 0){
                Map<String, Object> jfEchartData = (Map<String, Object>)data.get("result");
                if (jfEchartData != null)
                    pdMap.put("PDEchartData", jfEchartData.get("data"));
            }
            pdMapList.add(pdMap);
            pdMapMap.put(o.getDevId(), pdMap);
        }
        Map<String, Object> data = new HashMap<>();
        data.put("pdMapList", pdMapList);
        data.put("pdMapMap", pdMapMap);
        return data;
    }

    private Map<Long, Integer> countAreaSubAreaDevStatus(List<TBusiDevStatusInfoEntity> list){
        Map<Long, Integer> statusMap = new HashMap<>();
        for (TBusiDevStatusInfoEntity o : list){
            statusMap.put(o.getDevArea(), o.getCnt());
        }
        Map<Long, String> subAreaMap = tInfoAreaInfoService.getAreaSubAreaMap();
        Map<Long, Integer> subAreaStatusMap = new HashMap<>();
        for (Long areaId : subAreaMap.keySet()) {
            int cnt = 0;
            for (String subId : subAreaMap.get(areaId).split(",")){
                cnt += statusMap.containsKey(Long.parseLong(subId)) ? statusMap.get(Long.parseLong(subId)) : 0;
            }
            subAreaStatusMap.put(areaId, cnt);
        }
        return subAreaStatusMap;
    }

    private Map<Long, Integer> countAreaSubAreaDevMeasure(List<TBusiDevMonitorInfoEntity> list){
        Map<Long, Integer> statusMap = new HashMap<>();
        for (TBusiDevMonitorInfoEntity o : list){
            statusMap.put(o.getDevArea(), o.getCnt());
        }
        Map<Long, String> subAreaMap = tInfoAreaInfoService.getAreaSubAreaMap();
        Map<Long, Integer> subAreaStatusMap = new HashMap<>();
        for (Long areaId : subAreaMap.keySet()) {
            int cnt = 0;
            String subAreaStr = tInfoAreaInfoService.getAreaSubAreaInfo(areaId);
            for (String subId : subAreaMap.get(areaId).split(",")){
                cnt += statusMap.containsKey(Long.parseLong(subId)) ? statusMap.get(Long.parseLong(subId)) : 0;
            }
            subAreaStatusMap.put(areaId, cnt);
        }
        return subAreaStatusMap;
    }

    /**
     * 获取配电房终端设备状态信息+热点信息
     */
    @RequestMapping("/getDevStatusBySta")
    @RequiresPermissions("substation:tbusidevstatusinfo:getDevStatusBySta")
    public R getDevStatusBySta(@RequestParam String stationId){
        Map<String, Object> data = new HashMap<>();
        int staDevCnt = 0, staOfflineCnt = 0;
        Map<String, Object> param = new HashMap<>();
        param.put("stationId", stationId);
        staDevCnt = tBusiDevStatusInfoService.countAllDevNumBySta(param);
        staOfflineCnt = tBusiDevStatusInfoService.countOfflineDevNumBySta(param);
        data.put("staDevCnt", staDevCnt);
        data.put("staOfflineCnt", staOfflineCnt);
        List<Map<String, Object>> list = getAreaHotList(Long.valueOf(stationId));
        data.put("list", list);
        return R.ok().put("data", data);
    }

    /**
     * 获取区域终端设备状态信息+热点信息
     */
    @RequestMapping("/getDevStatusByArea")
    @RequiresPermissions("substation:tbusidevstatusinfo:getDevStatusByArea")
    public R getDevStatusByArea(@RequestParam String stationId){
        Map<String, Object> data = new HashMap<>();
        Long areaId = Long.parseLong(stationId);
        String subAreaStr = tInfoAreaInfoService.getSubAreaList(areaId);
        int staDevCnt = 0, staOfflineCnt = 0;
        staDevCnt = tBusiDevStatusInfoService.countAllDevNumByArea(subAreaStr);
        staOfflineCnt = tBusiDevStatusInfoService.countOfflineDevNumByArea(subAreaStr);
        data.put("staDevCnt", staDevCnt);
        data.put("staOfflineCnt", staOfflineCnt);
        List<Map<String, Object>> list = getAreaHotList(Long.valueOf(stationId));
        data.put("list", list);
        return R.ok().put("data", data);
    }

    /**
     * 获取设备监测数据
     */
    @RequestMapping("/getDevDataByDev")
    @RequiresPermissions("substation:tbusidevstatusinfo:getDevDataByDev")
    public R getDevDataByDev(@RequestParam String devId){
        TInfoDevInfoEntity dev = tInfoDevInfoService.getById(devId);
        String devCode = dev.getDevCode() != null ? dev.getDevCode() : "";
        if (dev.getDevType().equals("01"))
            return R.ok().put("devData", getDevDataByDevCode01(devCode));
        else
            return R.ok().put("devData", getDevDataByDevCode00(devCode));
    }

    private R getDevDataByDevCode01(String devCode){
        Map<String, Map<String, Object>> devData = new HashMap<>();
        Map<String, TBaseDictInfoEntity> dictMap = tBaseDictInfoService.getCacheDictInfoMapByKey("ENVIRONMENT_TYPE");
        TBusiDevMonitorInfoEntity queryTmp= new TBusiDevMonitorInfoEntity();
        queryTmp.setDevCode(devCode);
        List<TBusiDevMonitorInfoEntity> queryList = tBusiDevMonitorInfoService.queryMonitorByCondition(queryTmp);
        for(TBusiDevMonitorInfoEntity q : queryList){
            if(q.getVariableDesc().contains(ConstChinese.CH_WATER) && q.getVariableKind().equals("00")){
                Map<String, Object> obj = new HashMap<>();
                obj.put("水泵状态", q.getVariableStatus().equals("0") ? "正常" : "告警");
                obj.put(q.getVariableDesc(), q.getVariableValue());
                devData.put(q.getVariableDesc(), obj);
            } else if(q.getVariableDesc().contains(ConstChinese.CH_RED) && q.getVariableKind().equals("00")){
                Map<String, Object> obj = new HashMap<>();
                obj.put("状态", q.getVariableStatus().equals("0") ? "无烟" : "有烟");
                devData.put(q.getVariableDesc(), obj);
            } else if(q.getVariableDesc().contains(ConstChinese.CH_RED) && q.getVariableKind().equals("00")){
                Map<String, Object> obj = new HashMap<>();
                obj.put("状态", q.getVariableStatus().equals("0") ? "无人" : "有人");
                devData.put(q.getVariableDesc(), obj);
            } else if(q.getVariableDesc().contains(ConstChinese.CH_LIGHT) && q.getVariableKind().equals("00")){
                Map<String, Object> obj = new HashMap<>();
                obj.put("开关状态", q.getVariableStatus().equals("0") ? "开启" : "关闭");
                devData.put(q.getVariableDesc(), obj);
            } else if(q.getVariableDesc().contains("温度") && q.getVariableKind().equals("00")){
                Map<String, Object> obj = new HashMap<>();
                obj.put("温度", q.getVariableStatus().equals("0") ? "正常" : "告警");
                obj.put(q.getVariableDesc(), q.getVariableValue());
                devData.put(q.getVariableDesc(), obj);
            } else if(q.getVariableDesc().contains("湿度") && q.getVariableKind().equals("00")){
                Map<String, Object> obj = new HashMap<>();
                obj.put("湿度", q.getVariableStatus().equals("0") ? "正常" : "告警");
                obj.put(q.getVariableDesc(), q.getVariableValue());
                devData.put(q.getVariableDesc(), obj);
            }else if(q.getVariableDesc().contains("SF6") && q.getVariableKind().equals("00")){
                Map<String, Object> obj = new HashMap<>();
                obj.put("SF6", q.getVariableStatus().equals("0") ? "正常" : "告警");
                obj.put(q.getVariableDesc(), q.getVariableValue());
                devData.put(q.getVariableDesc(), obj);
            }else if(q.getVariableDesc().contains("O2") && q.getVariableKind().equals("00")){
                Map<String, Object> obj = new HashMap<>();
                obj.put("O2", q.getVariableStatus().equals("0") ? "正常" : "告警");
                obj.put(q.getVariableDesc(), q.getVariableValue());
                devData.put(q.getVariableDesc(), obj);
            }else if(q.getVariableDesc().contains("O3") && q.getVariableKind().equals("00")){
                Map<String, Object> obj = new HashMap<>();
                obj.put("O3", q.getVariableStatus().equals("0") ? "正常" : "告警");
                obj.put(q.getVariableDesc(), q.getVariableValue());
                devData.put(q.getVariableDesc(), obj);
            }
//            else if(!q.getVariableKind().equals("00")){
//                String key = "环境量" + q.getVariableKind().substring(1,2);
//                Map<String, Object> obj;
//                if (!devData.containsKey(key))
//                    obj = new HashMap<>();
//                else
//                    obj = devData.get(key);
//                String str = dictMap.containsKey(q.getVariableCode()) ? dictMap.get(q.getVariableCode()).getKeyDesc() : "";
//                obj.put(q.getVariableDesc(), q.getVariableValue() + str);
//                devData.put(key, obj);
//            }
        }
        return R.ok().put("devData", devData);
    }

    /**
     * 获取设备监测数据
     */
    private R getDevDataByDevCode00(String devCode){
        Map<String, Map<String, Object>> devData = new HashMap<>();

        TBusiDevMonitorInfoEntity queryTmp= new TBusiDevMonitorInfoEntity();
        queryTmp.setDevCode(devCode);
        queryTmp.setVariableKind("00");

        List<TBusiDevMonitorInfoEntity> queryList = tBusiDevMonitorInfoService.queryMonitorByCondition(queryTmp);
        //查询寻图片信息
        TFileInfoEntity query_file= new TFileInfoEntity();
        query_file.setDevId(devCode);
        List<TFileInfoEntity> queryFileList = tFileInfoService.queryFileInfoByCondition(query_file);

        PartialDischargeInfo tmp= new PartialDischargeInfo();
        tmp.setDtlList(queryList);
        tmp.init();

        for(TBusiDevMonitorInfoEntity q : queryList){
            if(q.getVariableDesc().contains(PartialDischargeInfo.PDINFO)){//局放
                //局放-状态，峰值 ，均值，频次，图片1，图片2
                Map<String, Object> pd = new HashMap<>();
                pd.put("状态", q.getVariableStatus().equals("0") ? "正常" : "告警");
                TSampJfDataInfoEntity query_jf=new TSampJfDataInfoEntity();
                query_jf.setDevId(q.getDevCode());
                TSampJfDataInfoEntity tmp_jf=tSampJfDataInfoService.queryJfInfoByCondition(query_jf);
                if(tmp_jf!=null) {
                    pd.put("峰值", tmp_jf.getMaxDsch() + "mV=");
                    pd.put("均值", tmp_jf.getAvDsch() + "mV=");
                    pd.put("频次", tmp_jf.getDschCnt() +"次/秒=");
                }
                pd.put("pic1", getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_JFPRPDIMG));
                pd.put("pic2", getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_JFPRPSIMG));
                devData.put("局放", pd);
            } else if(q.getVariableDesc().contains(PartialDischargeInfo.INFRAREDINFO)){
                //红外-状态，最高温，最低温，图片1，图片2
                Map<String, Object> infrared = new HashMap<>();
                infrared.put("状态", q.getVariableStatus().equals("0") ? "正常" : "告警");
                TSampIrSensorTempEntity query_ir= new TSampIrSensorTempEntity();
                query_ir.setDevId(q.getDevCode());
                query_ir.setAreaName("ALL");
                TSampIrSensorTempEntity tmp_ir=tSampIrSensorTempService.queryIrInfoByCondition(query_ir);
                if(tmp_ir!=null) {
                    infrared.put("最高温", tmp_ir.getAreaMaxTemp() + "℃");
                    infrared.put("最低温", tmp_ir.getAreaMinTemp() + "℃");
                }
                infrared.put("pic1", getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_IRIMG));
                infrared.put("pic2", getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_IROVIMG));
                devData.put("红外热像", infrared);
            } else if(q.getVariableDesc().contains(PartialDischargeInfo.HUMIDITY)){
                //湿度-状态，湿度
                Map<String, Object> humidity = new HashMap<>();
                humidity.put("状态", q.getVariableStatus().equals("0") ? "正常" : "告警");
                TSampThDataInfoEntity query_th= new TSampThDataInfoEntity();
                query_th.setDevId(q.getDevCode());
                TSampThDataInfoEntity tmp_th=tSampThDataInfoService.queryThInfoByCondition(query_th);
                if(tmp_th!=null) {
                    humidity.put("湿度", tmp_th.getRelativeHumidity() + "%rH");
                }
                devData.put("湿度", humidity);
            } else if(q.getVariableDesc().contains(PartialDischargeInfo.TEMPERATURE)){
                //温湿度-状态，温度
                Map<String, Object> temperature = new HashMap<>();
                temperature.put("状态", q.getVariableStatus().equals("0") ? "正常" : "告警");
                TSampThDataInfoEntity query_th= new TSampThDataInfoEntity();
                query_th.setDevId(q.getDevCode());
                TSampThDataInfoEntity tmp_th=tSampThDataInfoService.queryThInfoByCondition(query_th);
                if(tmp_th!=null) {
                    temperature.put("温度", tmp_th.getAmbientTemp() + "℃");
                }
                devData.put("温度", temperature);
            } else if(q.getVariableDesc().contains(PartialDischargeInfo.PICTURESINFO)){
                //可见光-状态，图片1，图片2，图片3
                Map<String, Object> light = new HashMap<>();
                light.put("状态", q.getVariableStatus().equals("0") ? "正常" : "告警");
                light.put("pic1", getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_CAMIMG));
                light.put("pic2", getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_CAMSOBELIMG));
                light.put("pic3", getBase64Pic(queryFileList,PartialDischargeInfo.PURPOSE_CAMIDIMG));
                devData.put("可见光", light);
            } else if(q.getVariableDesc().contains(PartialDischargeInfo.NOISEINFO)){
                //噪声-状态
                Map<String, Object> noise = new HashMap<>();
                noise.put("状态", q.getVariableStatus().equals("0") ? "正常" : "告警");
                devData.put("噪声", noise);
            } else {
                Map<String, Object> var = new HashMap<>();
                var.put("状态", q.getVariableStatus().equals("0") ? "正常" : "告警");
                devData.put(q.getVariableDesc(), var);
            }
        }
        return R.ok().put("devData", devData);
    }

    /**
     * 获取设备监测数据
     */
    private R getDevDataByDevCode(String devCode, Map<String, String> variableMap){
        Map<String, Map<String, Object>> devData = new HashMap<>();
        TBusiDevMonitorInfoEntity queryTmp= new TBusiDevMonitorInfoEntity();
        queryTmp.setDevCode(devCode);
        List<TBusiDevMonitorInfoEntity> queryList = tBusiDevMonitorInfoService.queryMonitorByCondition(queryTmp);
        for(TBusiDevMonitorInfoEntity q : queryList){
            if(q.getVariableKind().equals("00") && q.getVariableCode().equals("7")){//局放
                //局放-状态，峰值 ，均值，频次
                Map<String, Object> pd = new HashMap<>();
                pd.put("status", q.getVariableStatus());
                TSampJfDataInfoEntity query_jf=new TSampJfDataInfoEntity();
                query_jf.setDevId(q.getDevCode());
                TSampJfDataInfoEntity tmp_jf=tSampJfDataInfoService.queryJfInfoByCondition(query_jf);
                if(tmp_jf!=null) {
                    pd.put("局放峰值", tmp_jf.getMaxDsch() + "mV");
                    pd.put("局放均值", tmp_jf.getAvDsch() + "mV");
                    pd.put("局放频次", tmp_jf.getDschCnt() +"次/秒");
//                    if(q.getVariableStatus().equals("1")) {//局放告警时需去比较告警上下限值，以区分是局放的什么值告警
//                        if ("1".equals(tInfoAlarmConfigService.compareVariableAlarmConfig(devCode,
//                                q.getVariableCode() + q.getVariableKind(), "1", tmp_jf.getDschCnt()))) {//局放频次
//                            pd.put("status1", "1");
//                        }
//                        if ("1".equals(tInfoAlarmConfigService.compareVariableAlarmConfig(devCode,
//                                q.getVariableCode() + q.getVariableKind(), "2", tmp_jf.getMaxDsch()))) {//局放峰值
//                            pd.put("status2", "1");
//                        }
//                        if ("1".equals(tInfoAlarmConfigService.compareVariableAlarmConfig(devCode,
//                                q.getVariableCode() + q.getVariableKind(), "3", tmp_jf.getAvDsch()))) {//局放均值
//                            pd.put("status3", "1");
//                        }
//                    }
                }
                devData.put(q.getVariableCode() + q.getVariableKind(), pd);
            } else if(q.getVariableKind().equals("00") && q.getVariableCode().equals("8")){//红外热像
                //红外-状态，最高温，最低温
                Map<String, Object> infrared = new HashMap<>();
                infrared.put("status", q.getVariableStatus());
                TSampIrSensorTempEntity query_ir= new TSampIrSensorTempEntity();
                query_ir.setDevId(q.getDevCode());
                query_ir.setAreaName("ALL");
                TSampIrSensorTempEntity tmp_ir=tSampIrSensorTempService.queryIrInfoByCondition(query_ir);
                if(tmp_ir!=null) {
                    infrared.put("红外最高温", tmp_ir.getAreaMaxTemp() + "℃");
                    infrared.put("红外最低温", tmp_ir.getAreaMinTemp() + "℃");
//                    if(q.getVariableStatus().equals("1")) {//红外告警时需去比较告警上下限值，以区分是红外的什么值告警
//                        if ("1".equals(tInfoAlarmConfigService.compareVariableAlarmConfig(devCode,
//                                q.getVariableCode() + q.getVariableKind(), "1", tmp_ir.getAreaMaxTemp()))){//红外最高温
//                            infrared.put("status1", "1");
//                        }
//                        if ("1".equals(tInfoAlarmConfigService.compareVariableAlarmConfig(devCode,
//                                q.getVariableCode() + q.getVariableKind(), "2", tmp_ir.getAreaMinTemp()))){//红外最低温
//                            infrared.put("status2", "1");
//                        }
//                    }
                }
                devData.put(q.getVariableCode() + q.getVariableKind(), infrared);
            } else if(q.getVariableKind().equals("00") && q.getVariableCode().equals("6")){//湿度
                //湿度-状态，湿度
                Map<String, Object> humidity = new HashMap<>();
                humidity.put("status", q.getVariableStatus());
                TSampThDataInfoEntity query_th= new TSampThDataInfoEntity();
                query_th.setDevId(q.getDevCode());
                TSampThDataInfoEntity tmp_th=tSampThDataInfoService.queryThInfoByCondition(query_th);
                if(tmp_th!=null) {
                    humidity.put("湿度", tmp_th.getRelativeHumidity() + "%rH");
                }
                devData.put(q.getVariableCode() + q.getVariableKind(), humidity);
            } else if(q.getVariableKind().equals("00") && q.getVariableCode().equals("5")){//温度
                //温度-状态，温度
                Map<String, Object> temperature = new HashMap<>();
                temperature.put("status", q.getVariableStatus());
                TSampThDataInfoEntity query_th= new TSampThDataInfoEntity();
                query_th.setDevId(q.getDevCode());
                TSampThDataInfoEntity tmp_th=tSampThDataInfoService.queryThInfoByCondition(query_th);
                if(tmp_th!=null) {
                    temperature.put("温度", tmp_th.getAmbientTemp() + "℃");
                }
                devData.put(q.getVariableCode() + q.getVariableKind(), temperature);
            } else if(q.getVariableKind().equals("00") && q.getVariableCode().equals("9")){//可见光
                //可见光-状态
                Map<String, Object> light = new HashMap<>();
                light.put("status", q.getVariableStatus());
                devData.put(q.getVariableCode() + q.getVariableKind(), light);
            } else if(q.getVariableKind().equals("00") && q.getVariableCode().equals("10")){//噪声
                //噪声-状态
                Map<String, Object> noise = new HashMap<>();
                noise.put("status", q.getVariableStatus());
                devData.put(q.getVariableCode() + q.getVariableKind(), noise);
            } else {
                Map<String, Object> var = new HashMap<>();
                var.put("status", q.getVariableStatus());
                var.put(variableMap.containsKey(q.getVariableCode() + q.getVariableKind()) ? variableMap.get(q.getVariableCode() + q.getVariableKind())
                        : q.getVariableCode(), q.getVariableValue());
                devData.put(q.getVariableCode() + q.getVariableKind(), var);
            }
        }
        return R.ok().put("devData", devData);
    }

    /**
     * 获取配电房标注信息
     */
    @RequestMapping("/getAreaImgHotTag")
    @RequiresPermissions("substation:tbusidevstatusinfo:getAreaImgHotTag")
    public R getImgTagList(@RequestParam Long areaId) {
        logger.info("substation:tbusidevstatusinfo:getAreaImgHotTag start...");
        List<Map<String, Object>> list = getAreaHotListNew(areaId);
        logger.info("substation:tbusidevstatusinfo:getAreaImgHotTag end...");
        return R.ok().put("data", list);
    }

    private List<Map<String, Object>> getAreaHotListNew(Long areaId){
        List<Map<String, Object>> list = new ArrayList<>();
        List<TBusiAreaHotInfoEntity> areaTagList = tBusiAreaHotInfoService.getAreaHotInfoByArea(areaId);
        if (areaTagList != null && areaTagList.size() == 0)
            return list;
        //获取热点信息中的设备个数
        List<String> hotDevList = new ArrayList<>();
        for (TBusiAreaHotInfoEntity o : areaTagList) {
            if (!hotDevList.contains(o.getDevCode())){
                hotDevList.add(o.getDevCode());
            }
        }
        //获取变量map
        Map<String, String> variableMap = tInfoVariableInfoService.getVariableNameMap();//设备热点信息map
        //获取设备的热点信息
        Map<String, Object> devHotMap = new HashMap<>();//设备热点信息map
        for (String dev : hotDevList) {
            if ("".equals(dev))
                continue;
            R devData = getDevDataByDevCode(dev, variableMap);
            devHotMap.put(dev, devData);
        }

        Map<String, Object> obj = new HashMap<>();
        Map<Long, String> areaNameMap = tInfoAreaInfoService.getAreaNameMap();
        for (TBusiAreaHotInfoEntity o : areaTagList) {
            obj = new HashMap<>();
            //区分配电房和被监控设备
            String devCode = o.getDevCode();
            Long jumpAreaId = o.getJumpAreaId();
            if (!"".equals(devCode)){ //有添加热点设备
                Map<String, Map<String, Object>> devData = (Map<String, Map<String, Object>>) devHotMap.get(devCode);
                if (devData == null || devData.get("devData") == null)
                    continue;
                String variable = o.getVariableInfo();
                if (variable != null && variable.length() > 0){
                    String tagDesc = "";
                    String[] variableStr = variable.split(",");
                    for (String variableId : variableStr){
                        String varDesc = "";
                        if (devData.get("devData").containsKey(variableId)) {
                            Map<String, Object> varMap = (Map<String, Object>) devData.get("devData").get(variableId);
                            for (String key : varMap.keySet()) {
                                if (!key.equals("status"))
                                    varDesc += key + "：" + varMap.get(key) + "<br />";
                            }
                            //给状态异常的变量赋红色
                            if (varMap.get("status").equals("1")){//1表示异常显示红色，正常则无需处理
                                varDesc = "<font style=\"color: red;\"> " + varDesc + "</font>";
                            }
                        }
                        tagDesc += varDesc;
                    }
                    obj.put("dev", devCode);
                    obj.put("name", o.getJumpAreaId());
                    obj.put("desc", tagDesc);
                    //坐标信息
                    obj.put("top", o.getPositionTop());
                    obj.put("left", o.getPositionLeft());
                    obj.put("pos_z", o.getPositionZ());
                    list.add(obj);
                }
            } else { //没有添加热点设备
                obj.put("dev", devCode);
                obj.put("jump", o.getJumpAreaId());
                obj.put("name", o.getJumpAreaId());
                obj.put("desc", "");
                //坐标信息
                obj.put("top", o.getPositionTop());
                obj.put("left", o.getPositionLeft());
                obj.put("pos_z", o.getPositionZ());
                list.add(obj);
            }

        }
        return list;
    }

    private List<Map<String, Object>> getAreaHotList(Long areaId){
        List<TBusiAreaHotInfoEntity> areaTagList = tBusiAreaHotInfoService.getAreaHotInfoByArea(areaId);
        List<Map<String, Object>> list = new ArrayList<>();
        Map<String, Object> obj = new HashMap<>();
        Map<Long, String> areaNameMap = tInfoAreaInfoService.getAreaNameMap();

        Map<String, Object> devMap = new HashMap<>();
        for (TBusiAreaHotInfoEntity o : areaTagList) {
            obj = new HashMap<>();
            //区分配电房和被监控设备
            String hotType = o.getHotType();
            String devCode = o.getDevCode();
            if (hotType.equals("2") || hotType.equals("3")) {//被监控设备
                List<TInfoDevInfoEntity> dev = tInfoDevInfoService.getDevInfoByDevCode(devCode);
                if (dev == null || dev.size() == 0)
                    continue;
                Long devId = (long)0;
                String devType = "00";//局放监测设备
                String devName = "";
                if (dev != null && dev.size() > 0) {
                    devId = dev.get(0).getId();
                    devType = dev.get(0).getDevType();
                    devName = dev.get(0).getDevName();
                }
                if (!devMap.containsKey(devCode)) {
                    R devData;
                    if (devType.equals("01"))
                        devData = getDevDataByDevCode01(devCode);
                    else
                        devData = getDevDataByDevCode00(devCode);
                    devMap.put(devCode, devData);
                }
                Map<String, Map<String, Object>> devData = (Map<String, Map<String, Object>>) devMap.get(devCode);
                String tagDesc = "";
                String variable = o.getVariableInfo();
                String variableId = variable.length() >= 3 ? variable.substring(0, variable.length() - 2) : "0";
                String variableKind = variable.length() >= 3 ? variable.substring(variable.length() - 2, variable.length()) : "0";
                String variableName = o.getVariableDesc();
                if (devData.get("devData").containsKey(variableName)) {
                    Map<String, Object> varMap = (Map<String, Object>) devData.get("devData").get(variableName);
                    for (String key : varMap.keySet()) {
                        if (key.startsWith("pic"))
                            obj.put(key, varMap.get(key));
                        else
                            tagDesc += key + ":" + varMap.get(key) + "=";
                        if (key.equals("状态") && varMap.get(key).equals("告警"))
                            obj.put("color", "1");//tag颜色，1表示异常显示红色，正常则无需赋值
                    }
                    obj.put("dev", devCode);
                    obj.put("name", variableName);
                    obj.put("desc", tagDesc);
                    //坐标信息
                    obj.put("top", o.getPositionTop());
                    obj.put("left", o.getPositionLeft());
                    obj.put("pos_z", o.getPositionZ());
                    list.add(obj);
                } else {
                    obj.put("id", devId);
                    obj.put("dev", devCode);
                    obj.put("name", variableName);
                    obj.put("desc", tagDesc);
                    //坐标信息
                    obj.put("top", o.getPositionTop());
                    obj.put("left", o.getPositionLeft());
                    obj.put("pos_z", o.getPositionZ());
                    list.add(obj);
                }
            } else if (hotType.equals("1") || hotType.equals("0")){//1-配电房
                obj.put("dev", devCode);
                obj.put("name", areaNameMap.containsKey(Long.parseLong(devCode)) ? areaNameMap.get(Long.parseLong(devCode)) : devCode);
                obj.put("desc", "");
                //坐标信息
                obj.put("top", o.getPositionTop().contains("px") ? o.getPositionTop() : o.getPositionTop() + "px");
                obj.put("left", o.getPositionLeft().contains("px") ? o.getPositionLeft() : o.getPositionLeft() + "px");
                obj.put("pos_z", o.getPositionZ());
                list.add(obj);
            }
        }
        return list;
    }

    private Map<Long, List<Map<String, Object>>> getAllAreaHotMap(){
        Map<Long, List<Map<String, Object>>> areaHotMap = new HashMap<>();
        List<TBusiAreaHotInfoEntity> areaTagList = tBusiAreaHotInfoService.list();
        List<Map<String, Object>> list;
        Map<String, Object> obj;
        Map<Long, String> areaNameMap = tInfoAreaInfoService.getAreaNameMap();

        Map<String, Object> devMap = new HashMap<>();
        for (TBusiAreaHotInfoEntity o : areaTagList) {
            Long areaId = o.getAreaId();
            if (!areaHotMap.containsKey(areaId))
                list = new ArrayList<>();
            else
                list = areaHotMap.get(areaId);
            obj = new HashMap<>();
            //区分配电房和被监控设备
            String hotType = o.getHotType();
            String devCode = o.getDevCode();
            if (hotType.equals("2") || hotType.equals("3")) {//被监控设备
                List<TInfoDevInfoEntity> dev = tInfoDevInfoService.getDevInfoByDevCode(devCode);
                Long devId = (long)0;
                String devType = "00";//局放监测设备
                String devName = "";
                if (dev != null && dev.size() > 0) {
                    devId = dev.get(0).getId();
                    devType = dev.get(0).getDevType();
                    devName = dev.get(0).getDevName();
                }
                if (!devMap.containsKey(devCode)){
                    R devData;
                    if (devType.equals("01"))
                        devData = getDevDataByDevCode01(devCode);
                    else
                        devData = getDevDataByDevCode00(devCode);
                    devMap.put(devCode, devData);
                }
                Map<String, Map<String, Object>> devData = (Map<String, Map<String, Object>>)devMap.get(devCode);
                String tagDesc = "";
                String variable = o.getVariableInfo();
                String variableId = variable.length() >= 3 ? variable.substring(0, variable.length() - 2) : "0";
                String variableKind = variable.length() >= 3 ? variable.substring(variable.length() - 2, variable.length()) : "0";
                String variableName = o.getVariableDesc();
                if (devData.get("devData").containsKey(variableName)){
                    Map<String, Object> varMap = (Map<String, Object>)devData.get("devData").get(variableName);
                    for (String key : varMap.keySet()){
                        if (key.startsWith("pic"))
                            obj.put(key, varMap.get(key));
                        else
                            tagDesc += key + ":" + varMap.get(key) + "=";
                        if (key.equals("状态") && varMap.get(key).equals("告警"))
                            obj.put("color", "1");//tag颜色，1表示异常显示红色，正常则无需赋值
                    }
                    obj.put("id", devId);
                    obj.put("dev", devCode);
                    obj.put("name", variableName);
                    obj.put("desc", tagDesc);
                    //坐标信息
                    obj.put("top", o.getPositionTop());
                    obj.put("left", o.getPositionLeft());
                    obj.put("pos_z", o.getPositionZ());
                    list.add(obj);
                } else {
                    obj.put("id", devId);
                    obj.put("dev", devCode);
                    obj.put("name", variableName);
                    obj.put("desc", tagDesc);
                    //坐标信息
                    obj.put("top", o.getPositionTop());
                    obj.put("left", o.getPositionLeft());
                    obj.put("pos_z", o.getPositionZ());
                    list.add(obj);
                }
                areaHotMap.put(areaId, list);
            } else if (hotType.equals("1") || hotType.equals("0")){//1-配电房
                obj.put("dev", devCode);
                obj.put("name", areaNameMap.containsKey(Long.parseLong(devCode)) ? areaNameMap.get(Long.parseLong(devCode)) : devCode);
                obj.put("desc", "");
                //坐标信息
                obj.put("top", o.getPositionTop());
                obj.put("left", o.getPositionLeft());
                obj.put("pos_z", o.getPositionZ());
                list.add(obj);
                areaHotMap.put(areaId, list);
            }
        }
        return areaHotMap;
    }

    /**
     * 根据年 月 获取对应的月份 天数
     */
    public int getDaysByYearMonth(String yearmonth) {

        int year=Integer.valueOf(yearmonth.substring(0,4));
        int month=Integer.valueOf(yearmonth.substring(4));
        Calendar a = Calendar.getInstance();
        a.set(Calendar.YEAR, year);
        a.set(Calendar.MONTH, month - 1);
        a.set(Calendar.DATE, 1);
        a.roll(Calendar.DATE, -1);
        int maxDate = a.get(Calendar.DATE);
        return maxDate;
    }
}
